簡體   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