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:…,…}),})