通过使用arrayUnion是否可以更新地图中的数组?

时间:2019-01-14 23:47:37

标签: typescript firebase 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')},}
        );

});

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

我在做什么错了?

1 个答案:

答案 0 :(得分:2)

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

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

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

请注意点号用于明确调用列表。