如何使用flutter将带有地图数据的文档添加到firestore

2 dart firebase flutter google-cloud-firestore

我想要一个像下面这样的文件

在此处输入图片说明

但是当我使用以下代码添加包含地图的新文档时,它会添加如下图所示的数据

 Firestore.instance.collection('users').document(some_docID).updateData({
      'map1.key1': 'value1',
      'map1.key2': 'value2'
    });
Run Code Online (Sandbox Code Playgroud)

即使我使用 setData 它仍然添加如下数据,而不是我想要的上图中的数据。

在此处输入图片说明

还有一件事是,如果文档已经存在并且它至少有一个地图字段,那么如果我使用上面的代码,它只会将数据添加为地图。问题仅在于我想用地图值创建新文档时。如果有人可以提出解决方案,那将有很大帮助。

Jac*_*lly 8

document.updateData和之间有几个区别document.setData,需要理解:

首先,你不能创建使用文档updateData。必须在调用之前创建文档,updateData否则调用将失败。这可能是您问题的根源。

创建包含嵌套数据的文档

您必须使用document.setData. setData要求您以“嵌套”格式指定数据,其中字段不是“扁平化”或“点分隔”。

所以对于你的例子:

 Firestore.instance.collection('users').document(some_docID).setData({
      'map1': {
        'key1': 'value1',
        'key2': 'value2',
      }});
Run Code Online (Sandbox Code Playgroud)

使用嵌套数据更新文档

如果你想保证一个文档是之前创建的,那么你应该使用document.updateData(如前所述,如果之前document没有创建,将会失败)。

updateData 要求以“点分隔”方式指定嵌套字段。

所以对于你的例子:

updateData({
      'map1.key1': 'value1',
      'map1.key2': 'value2',
});
Run Code Online (Sandbox Code Playgroud)

不小心用嵌套字段覆盖了字段 updateData

如果您将嵌套格式的数据传递给updateData,它将假定您希望用后续数据完全替换键的值。

例如,如果您的文档数据{'a': {'b': 2, 'c': 3}}并运行updateData({'a': {'b': 4}})该文件将只是替换a.b4,也将删除c字段,因为它没有在包括a传递给值updataData

要仅明确字段,请使用点分隔格式或setData(data, merge: true)(见下文)。

使用更新数据 setData

注意:您还可以使用setData更新文档上的数据。尽管如此,所需的格式是“嵌套的”而不是点分隔的。

如果您只想document显式更新某些字段,则传递merge: truesetData.

  • 我现在明白了...感谢您的详细解释...真的很有帮助:) (2认同)