使用SetOptions.merge()时,为什么我的Cloud Firestore事务未合并?

时间:2017-11-18 12:17:41

标签: android firebase merge google-cloud-firestore

刚开始使用Firestore并在Cloud Firestore事务中使用SetOptions.merge(),这样我觉得没什么特别的:

final Map<String, Object> visitorMap = new HashMap<>();
visitorMap.put(Visitor.NOTIFY_ON_CHAT_MESSAGE, true);
visitorMap.put(Visitor.TIME, FieldValue.serverTimestamp());
final DocumentReference docRefVisitor = mFirestore
        .collection(VISITORS)
        .document(theId)
        .collection(VISITORS_USER)
        .document(getCurrentUser().getUserId());
mFirestore.runTransaction(new com.google.firebase.firestore.Transaction.Function<void>() {
    @Nullable
    @Override
    public void apply(@NonNull Transaction transaction) throws FirebaseFirestoreException {
        transaction.set(docRefVisitor, visitorMap, SetOptions.merge());
    }
})

文档说:

  

如果文档不存在,则会创建该文档。如果是文件   确实存在,其内容将被新提供的内容覆盖   数据,除非您指定数据应合并到   现有文件

我认为Visitor.NOTIFY_ON_CHAT_MESSAGE boolean正在覆盖Cloud Firestore数据库文档中的现有boolean。我虽然SetOptions.merge()不会覆盖现有值? 也许我错过了关于Transaction如何工作的事情,或者这是与Beta相关的事情,因为CF是Beta

1 个答案:

答案 0 :(得分:1)

关于import方法,official documentation说:

  

将set()调用的行为更改为仅替换其data参数中指定的值。

中set_()调用中省略的字段将保持不变。

所以SetOptions merge()方法只会替换fieldPaths下的字段。任何未在fieldPaths中指定的字段都将被忽略并保持不变。

作为一个结论,如果文档不存在,它将被创建。如果文档确实存在,其内容SetOptions.merge()包含新提供的数据,除非您指定数据应合并到现有文档中,如下所示:

will be overwritten