У меня есть два способа пройтись по базе данных и обновить каждый документ.
Вот это:
Firestore db = FirestoreClient.getFirestore();
//get all documents where expiresOn is already passed
ApiFuture<QuerySnapshot> future = db.collection("devices").whereLessThan("expiresOn", new Date()).get();
List<QueryDocumentSnapshot> documents = future.get().getDocuments();
for (DocumentSnapshot document : documents){
logger.info(document.getId() + " => " + document.getData().toString());
HashMap<String, Object> data = new HashMap<>();
data.put("expiresOn", null);
data.put("boughtUses", 0);
document.getReference().update(data);
}
или это:
ApiFuture<String> transaction = db.runTransaction(
new Transaction.Function<String>() {
@Override
public String updateCallback(Transaction transaction) throws Exception {
ApiFuture<QuerySnapshot> future = transaction.get(db.collection("devices").whereLessThan("expiresOn", new Date()));
List<QueryDocumentSnapshot> documents = future.get().getDocuments();
for (DocumentSnapshot document : documents){
HashMap<String, Object> data = new HashMap<>();
data.put("expiresOn", null);
data.put("boughtUses", 0);
transaction.update(document.getReference(), data);
}
return null;
}
}
);
logger.info(transaction.get());
Во-первых, я вызываю DocumentReference.update (), а во-вторых, я вызываю Transaction.update (). Я знаю, что DocumentReference.update () вызывается один за другим, но как насчет Transaction.update ()? Это также будет вызываться один за другим, или это будет группировать все записи вместе? Кроме того, если он сгруппирует их, будет ли считаться меньше записей для моего использования?