我想要一个像下面的文件
但是当我使用以下代码添加包含地图的新文档时,它将添加数据,如下图所示
Firestore.instance.collection('users').document(some_docID).updateData({
'map1.key1': 'value1',
'map1.key2': 'value2'
});
即使我使用setData,它仍然会按以下方式添加数据,而不是如上图所示的那样。
还有一件事是,如果文档已经存在并且至少具有一个map字段,那么如果我使用上述代码,它将仅将数据添加为map。问题仅在我想使用地图值创建新文档时出现。如果有人可以提出解决方案,那将是很大的帮助。
答案 0 :(得分:4)
document.updateData
和document.setData
之间存在一些差异,需要理解:
首先,您不能使用updateData
创建文档。必须在调用updateData
之前创建文档,否则调用将失败。这可能是您遇到问题的根源。
您必须使用document.setData
。 setData
要求您以“嵌套”格式指定数据,其中字段不会“拼合”或“以点分隔”。
因此,您的示例:
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"
}
});
这将在数据库中创建一个地图。