[英]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.