在多个文档上进行Firestore交易是否比逐个更新每个文档更有效?

时间:2018-11-06 20:26:49

标签: java firebase google-cloud-firestore

我有两种不同的方式可以浏览数据库并更新每个文档。 就是这个:

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()呢?是也要一一调用,还是将所有写入分组在一起?此外,如果确实将它们分组,是否算作我的使用次数较少的写操作?

1 个答案:

答案 0 :(得分:0)

  

我知道DocumentReference.update()一一被调用

是的。

  

这是否还会被一个一个地调用,还是将所有写入分组在一起?

也将被一一称为。

  

如果将它们分组,是否算作我使用量较少的写信?

如果认为这些写操作将被分组在一起,并且只对一次写操作收取费用,则不会,对于您要更新的每个文档,您将一一收取费用。

相关问题