2017-10-20 70 views
2

我正在使用Firestore並收集文檔。對於集合中的每個文檔,我想更新其中的一個字段。如何在Firestore中進行批量更新

使用事務來執行更新將是低效的,因爲我不需要在更新它時讀取任何數據。

批量更新似乎是正確的方向,但文檔不包括一次更新多個文檔的示例。請參閱:Batched Writes

+0

您鏈接的文檔有批量寫入的示例。 –

+0

我明白如何使用批量寫入。我在詢問如何爲集合中的每個文檔執行更新。 –

回答

1

如果您使用過Firebase數據庫,則不可能以原子方式寫入完全單獨的單獨位置,這就是爲什麼您必須使用批量寫入,這意味着要麼所有操作都成功,要麼都不是被應用。

關於Firestore,所有操作現在都是原子性的。但是,可以將多個寫入操作作爲包含set(),update()或delete()操作的任意組合的單個批處理執行。一批寫入以原子方式完成,並可寫入多個文檔。

這是一個關於批量操作寫入,更新和刪除操作的簡單示例。

WriteBatch batch = db.batch(); 

DocumentReference johnRef = db.collection("users").document("John"); 
batch.set(johnRef, new User()); 

DocumentReference maryRef = db.collection("users").document("Mary"); 
batch.update(maryRef, "Anna", 20); //Update name and age 

DocumentReference alexRef = db.collection("users").document("Alex"); 
batch.delete(alexRef); 

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

調用批處理對象commit()方法意味着你犯了整批。

+0

感謝您的快速回復,但我的問題是如何對集合中的每個文檔執行批量更新。這個答案重申了我提供的文檔鏈接中指出的內容,該文檔對單個文檔執行單獨寫入。 –

+0

這很簡單。從集合中獲取所有這些文檔並使用上述模型,使用所需的數據更新這些文檔。 –

+0

因此,爲了增加一些與查詢匹配的文檔中的計數,您必須將每個文檔讀入內存,然後將每個文檔都寫回去?自從1995年以來,MySQL一直可以[直接更新數據庫](https://dev.mysql.com/doc/refman/8.0/en/update.html),[MongoDB也支持多文檔更新] (https://docs.mongodb.com/manual/reference/method/db.collection.update/#example-update-specific-fields) - 但Firestore不?進步很多,驚歎數據庫,很哇! –