繁体   English   中英

Firestore:批量更新插入文档

[英]Firestore: Bulk Upsert documents

我是 firestore 以及 NoSQL 的新手。我想制作一个有点关系的简单数据库,有两个表,就关系数据库而言,一个是操作(患者)表,一个是事务(读数)表。

我有一个为患者表和读数表生成数据的应用程序。 一个应用程序实例可能包含许多独特患者的数据,每个患者在读数表中可能有不同的读数。

在 Firestore 中,我计划通过为提到的每个表格制作两个 collections 并为每个患者批量上传文档并阅读相应的集合来实现这一点。 现在每次我批量上传到 firestore 时,我想检查输入患者 JSONObjects 中的所有字段是否都存在于患者集合中,而不是选择 patientID else,创建一个新患者,并生成一个 ID 并输入读数使用给定的 patientID。

我尝试对事务执行此操作,但这仅适用于单个文档,如此处所述,( 我们可以不在事务中查询 collections 吗? )使用 Batch 仅可以进行 set()、update() 和 delete() 操作,如中所述文档,对于 batchget,我们也只能使用文档 ID 而不是字段进行搜索。

有什么办法可以做到这一点,模式有什么问题吗?

事实上,尝试从您的集合中批量读取数据然后更新它是不可能直接实现的。 正如此处其他类似案例中所阐明的那样,您最多可以一次读取 10 个文档,使用IN获取多个文档,但这不是很可行。

在不更改方案的情况下,最好的做法是使用forEach()完全读取集合,然后根据返回的 id 从特定文档执行批量更新。 这样,例如,使用 patientId,您应该能够更新所有读数。 下面的代码显示执行批处理,一旦你有 id。

DocumentReference patRef = db.collection("patients").document("id");
batch.update(patRef, "Value1", "Value2"); //Update two sample of fields in the document

batch.commit().addOnCompleteListener(new OnCompleteListener<Void>() {
    @Override
    public void onComplete(@NonNull Task<Void> task) {
        // ...
    }
});

另一种选择是使用Subcollections ,因此您可以将所有数据存储在一个父亲 collections 及其子集合中。 这样一来,您就可以在一个查询中处理所有事情,这肯定会让您的工作更加轻松。

我会说第二个更好,但是涉及重组您的计划。 好的部分是,一旦完成,您的工作就会容易得多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM