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 字段,因为它不包含在传递给updataData 的a 值中。
对于明确的字段,请使用点分隔格式或setData(data, merge: true)(见下文)。
使用setData更新数据
注意:您仍然可以使用setData 来更新文档上的数据。不过,所需的格式是“嵌套的”而不是点分隔的。
如果您只想显式更新document 的某些字段,则将merge: true 传递给setData。