如何使用arrayUnion更新地图中的数组?

Edu*_*chi 3 firebase typescript google-cloud-firestore

在 Firestore 中,我有一个包含名为 的地图的文档myMap,其中包含一个名为 的数组字段myArr

是否可以通过在事务中向其添加元素来arrayUnion用于更新myArr

await admin.firestore().runTransaction(async (transaction: Transaction) => {
    //

    const docRef: DocumentReference = admin.firestore()
        .doc(`collection/document`);

    const doc: DocumentSnapshot = await transaction.get(docRef);

    if (doc.exists) 
        await transaction.update(docRef,
            {'myMap': {'myArr': FieldValue.arrayUnion('myNewValue')},}
        );

});
Run Code Online (Sandbox Code Playgroud)

我相信上面的代码应该添加myArr,但它代替了整个数组。

我究竟做错了什么?

Dou*_*son 6

FieldValue.arrayUnion()并且FieldValue.arrayRemove()仅当在更新对象的顶层标识的字段本身是一个列表时才有效。您现在通过为对象提供列表所做的确实是在替换整个列表。它不会识别该列表的现有内容。

您可以做的是调出嵌入列表的特定名称:

    await transaction.update(docRef,
        {'myMap.myArr': FieldValue.arrayUnion('myNewValue')},}
    );
Run Code Online (Sandbox Code Playgroud)

请注意用于专门调用列表的点符号。