Firebase 如何将地图数组动态添加到云firestore?
我添加了这样的数据Firebase 如何将地图数组动态添加到云firestore?,firebase,flutter,google-cloud-firestore,Firebase,Flutter,Google Cloud Firestore,我添加了这样的数据 await firestoreSave.collection('chat').doc().set({ 'buyer_id': "76QlZL2IbADZBnvbofN3", 'book_id':"N5xlvDcWC5ffwdKWLA6DfF9FcfD2", 'seller_id': "ranjit", "messages": [ {&
await firestoreSave.collection('chat').doc().set({
'buyer_id': "76QlZL2IbADZBnvbofN3",
'book_id':"N5xlvDcWC5ffwdKWLA6DfF9FcfD2",
'seller_id': "ranjit",
"messages": [
{"message": "What is up", "timeStamp": "Dec 12", "type": userId}
]
}).catchError((onError) {
print(
"you have a error");
});
现在,如果我必须更新messages
字段。只需添加另一个键相同但值不同的地图,我将如何操作?我尝试使用
update
,但我只能在上一个映射中添加另一个字段,但我必须在数组中添加另一个映射。如何更新现有数据?有两种方法可以更新现有数据: 使用
更新(数据)
,仅当文档存在时才会更新给定字段。如果文档不存在,它将返回一个错误
使用set(data,SetOptions(merge:true))
将更新给定字段并合并它们,但如果文档不存在,它也将创建文档
现在,如果要在不更新其他字段的情况下向数组中添加值,则必须将FieldValue.arrayUnion
与set或update一起使用:
firestoreSave.collection('chat').doc().set({
"messages": FieldValue.arrayUnion(
[{"message": "What is up", "timeStamp": "Dec 12", "type": userId}]
)
}, SetOptions(merge: true))
请注意,FieldValue.arrayUnion
仅添加唯一值,而且它不适用于嵌套数组,这意味着您将无法使用它更新消息映射内的任何字段
正如@Renaud在评论中提到的,您也可以同时添加多个值,例如:
firestoreSave.collection('chat').doc().set({
"messages": FieldValue.arrayUnion(
[{"message": "What is up", "timeStamp": "Dec 12", "type": userId},
{"message": "What's new", "timeStamp": "Dec 12", "type": userId},
],
),
}, SetOptions(merge: true))
有两种方法可以更新现有数据: 使用
更新(数据)
,仅当文档存在时才会更新给定字段。如果文档不存在,它将返回一个错误
使用set(data,SetOptions(merge:true))
将更新给定字段并合并它们,但如果文档不存在,它也将创建文档
现在,如果要在不更新其他字段的情况下向数组中添加值,则必须将FieldValue.arrayUnion
与set或update一起使用:
firestoreSave.collection('chat').doc().set({
"messages": FieldValue.arrayUnion(
[{"message": "What is up", "timeStamp": "Dec 12", "type": userId}]
)
}, SetOptions(merge: true))
请注意,FieldValue.arrayUnion
仅添加唯一值,而且它不适用于嵌套数组,这意味着您将无法使用它更新消息映射内的任何字段
正如@Renaud在评论中提到的,您也可以同时添加多个值,例如:
firestoreSave.collection('chat').doc().set({
"messages": FieldValue.arrayUnion(
[{"message": "What is up", "timeStamp": "Dec 12", "type": userId},
{"message": "What's new", "timeStamp": "Dec 12", "type": userId},
],
),
}, SetOptions(merge: true))
这是一个很好的答案@OsaXma!注意,您可以向该方法传递多个值,如下所示
update({messages:firebase.firestore.FieldValue.arrayUnion({message:…,…},{message:…,…,…}),})
。这是一个很好的答案@OsaXma!注意,您可以向该方法传递多个值,如下所示update({messages:firebase.firestore.FieldValue.arrayUnion({message:…,…},{message:…,…}),})
。