如何使用Flutter将包含地图数据的文档添加到Firestore

时间:2020-07-08 06:20:10

标签: firebase flutter dart google-cloud-firestore

我想要一个像下面的文件

enter image description here

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

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

即使我使用setData,它仍然会按以下方式添加数据,而不是如上图所示的那样。

enter image description here

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

2 个答案:

答案 0 :(得分:4)

document.updateDatadocument.setData之间存在一些差异,需要理解:

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

使用嵌套数据创建文档

您必须使用document.setDatasetData要求您以“嵌套”格式指定数据,其中字段不会“拼合”或“以点分隔”。

因此,您的示例:

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

使用嵌套数据更新文档

如果要保证先前已创建文档,则应使用document.updateData(如前所述,如果先前未创建document将会失败)。

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

因此,您的示例:

updateData({
      'map1.key1': 'value1',
      'map1.key2': 'value2',
});

偶然用updateData中的嵌套字段覆盖字段

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

例如,如果您的文档中包含数据{'a': {'b': 2, 'c': 3}},并且您运行updateData({'a': {'b': 4}}),则文档不会只是将a.b替换为4,但是还将删除c字段,因为它没有包含在传递给a的{​​{1}}值中。

要仅显式地使用字段,请使用点分隔格式或updataData(请参见下文)。

使用setData(data, merge: true)

更新数据

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

如果您只想显式更新setData的某些字段,则将document传递到merge: true

答案 1 :(得分:0)

您必须像这样添加数据:

 Firestore.instance.collection('users').document(some_docID).updateData({
    "map1" : {
      "key1" : "value1",
      "key2" : "value2"
    }
    });

这将在数据库中创建一个地图。