Firestore 不会取代地图

问题描述 投票:0回答:2

我正在尝试使用以下代码替换 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 控制台中代码的输出:

Output

flutter firebase dart google-cloud-firestore
2个回答
1
投票

我自己也一直忘记这一点,但这里的逻辑是:

  • 使用合并选项设置文档会对所提供的数据执行深度合并。

  • 如果您想替换现有的顶级字段,请更新文档而不是设置它。

完整的代码示例:

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


0
投票

如果您想更换新地图。您必须使用“merge:false”选项。

SetOptions(merge: false)
© www.soinside.com 2019 - 2024. All rights reserved.