刚开始使用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
答案 0 :(得分:1)
关于import
方法,official documentation说:
将set()调用的行为更改为仅替换其data参数中指定的值。
中set_()调用中省略的字段将保持不变。
所以SetOptions merge()
方法只会替换fieldPaths下的字段。任何未在fieldPaths中指定的字段都将被忽略并保持不变。
作为一个结论,如果文档不存在,它将被创建。如果文档确实存在,其内容SetOptions.merge()
包含新提供的数据,除非您指定数据应合并到现有文档中,如下所示:
will be overwritten