Firestore:批量Upsert文件

问题描述

我是Firestore和Nosql的新手。我想创建一个简单的,有点关系的数据库,其中有两个表,就关系数据库而言,一个是可操作的(患者)表,一个是事务性(读数)表。

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

在Firestore中,我计划通过为每个提到的表制作两个集合并为每个患者批量上载文档并阅读相应的集合来实现此目的。 现在,每次我将文件批量上传到Firestore时,我都想检查输入的患者JSONObjects中的所有字段是否存在于患者集合中,而不是拾取耐心ID,创建新患者并生成ID并输入读数与给定的PatientID。

我尝试通过交易来完成此操作,但仅适用于单个文档,如此处所述(Can we not query collections inside transactions?) 如文档中所述,仅使用批处理set(),update()和delete()操作是可能的,而使用batchget时,我们也只能使用文档ID而不是字段进行搜索

有什么办法可以做到,架构是否有问题?

解决方法

实际上,试图从集合中批量读取数据,然后对其进行更新将无法直接进行。正如在其他类似情况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,因此您可以将所有数据存储在一个父集合及其子集合中。这样,您可以处理一个查询中的所有内容,这肯定会使您的工作更轻松。

我想说第二个更好,但是,这涉及到重组方案。好处是,一旦完成,您的工作就会容易得多。