【问题标题】:Firestore: Bulk Upsert documentsFirestore:批量更新插入文档
【发布时间】:2020-12-21 01:59:52
【问题描述】:

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

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

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

我尝试对事务执行此操作,但仅适用于单个文档,如此处所述,(Can we not query collections inside transactions?) 使用 Batch 时,只有 set()、update() 和 delete() 操作是可能的,正如文档中提到的那样,使用 batchget 时,我们只能使用文档 ID 而不是字段进行搜索。

我有什么办法可以做到这一点,架构有什么问题吗?

【问题讨论】:

  • 请提供一到两条示例记录。患者的唯一识别字段是什么?架构的一个想法是从一个独特的患者属性派生的文档 id 的集合,而读数是患者的子集合。
  • 所有患者字段都应该是唯一的。实际上,我主要关心的是更新患者集合而没有任何重复。

标签: google-cloud-firestore nosql relational-database upsert


【解决方案1】:

确实,无法直接尝试从您的集合中批量读取数据,然后对其进行更新。正如在另一个类似案例 here 中所阐明的那样,您一次最多可以读取 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,这样您就可以将所有数据存储在一个父集合及其子集合中。这样一来,您就可以在一个查询中处理所有事情,这肯定会让您的工作更轻松。

我会说第二个更好,但是,涉及重组您的方案。好处是,一旦你完成了,你的工作就会轻松很多。

【讨论】:

    猜你喜欢
    • 2015-10-20
    • 1970-01-01
    • 2012-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-02
    • 2021-02-16
    相关资源
    最近更新 更多