基本上,我想知道是否可以更新在Firestore中的集合中找到的所有文档。我可以像这样在列表中获取所有文档:
mFirebaseFirestore.collection("Events").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
List<String> list = new ArrayList<>();
for (QueryDocumentSnapshot document : task.getResult()) {
list.add(document.getId());
}
Log.d(TAG, list.toString());
} else {
Log.d(TAG, "Error getting documents: ", task.getException());
}
}
});
但是,我似乎无法一次更新所有文档或这些文档中的类似字符串。如果上述方法不可行,那么就可以解决所有文档的更新了。
答案 0 :(得分:1)
要先更新集合中的所有文档,您必须检索列表中的所有文档,然后迭代该列表并更新它们。这是示例代码:-
for (int k = 0; k < list.size(); k++) {
firestore.collection("Events").document(list.get(k))
.update("Key", value).addOnSuccessListener(new OnSuccessListener<Void>()
{
@Override
public void onSuccess(Void aVoid) {
Log.i("Update", "Value Updated");
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
Toast.makeText(MainActivity.this, "Error In Updating Details: " + e.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
答案 1 :(得分:0)
没有任何一项操作可以根据som搜索条件更新多个文档。您现在必须进行迭代查询结果,然后分别更新每个文档。您可能还可以使用transaction or batch write原子地执行更新,但这不会阻止您迭代初始查询结果中的所有文档。
答案 2 :(得分:0)
Raj的方法可以工作,但可能导致执行大量写操作。正如道格所说,您可能想批量写入。
void getData() {
mFirebaseFirestore.collection("Events").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
List<String> list = new ArrayList<>();
for (QueryDocumentSnapshot document : task.getResult()) {
list.add(document.getId());
}
Log.d(TAG, list.toString());
updateData(list); // *** new ***
} else {
Log.d(TAG, "Error getting documents: ", task.getException());
}
}
});
}
void updateData(ArrayList list) {
// Get a new write batch
WriteBatch batch = db.batch();
// Iterate through the list
for (int k = 0; k < list.size(); k++) {
// Update each list item
DocumentReference ref = db.collection("Events").document(list.get(k));
batch.update(ref, "field_you_want_to_update", "new_value");
}
// Commit the batch
batch.commit().addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
// Yay its all done in one go!
}
});
}
文档:https://firebase.google.com/docs/firestore/manage-data/transactions#batched-writes