我正在尝试使用以下代码替换 Firestore 中的地图(Dart/Flutter):
await FirebaseFirestore.instance.collection("test").doc("test").set({
"abc": {"def": 123}
}, SetOptions(merge: true));
await FirebaseFirestore.instance.collection("test").doc("test").set({
"abc": {"abc": 123}
}, SetOptions(merge: true));
问题是代码并没有替换已经存在的地图,而只是向其中添加了键。
这是 Firestore 控制台中代码的输出:
我自己也一直忘记这一点,但这里的逻辑是:
使用合并选项设置文档会对所提供的数据执行深度合并。
如果您想替换现有的顶级字段,请更新文档而不是设置它。
完整的代码示例:
doc.snapshots().listen((read) {
print(read.data());
});
print("Delete");
await doc.delete();
print("Initial set");
await doc.set({
"abc": {"def": 123}
}, SetOptions(merge: true));
print("Second set with merge");
await doc.set({
"abc": {"abc": 123}
}, SetOptions(merge: true));
print("Update");
await doc.update({
"abc": { "ghi": 123 }
});
打印:
删除
空初始设定
{abc:{def:123}}第二组合并
{abc:{abc:123,def:123}}更新
{abc:{ghi:123}}
有关此操作的运行示例,请参阅 https://zapp.run/edit/firestore-set-with-merge-2-z7fq06k28fr0
如果您想更换新地图。您必须使用“merge:false”选项。
SetOptions(merge: false)