Google Cloud Functions 向 firestore 中的地图添加值

Google Cloud Functions Add values to a map in firestore

这是我在 firestore 中向地图添加值的代码。目前地图每次都会被覆盖

exports.addTrainingtoList = functions.firestore
    .document('/users/{uid}/trainings/{trainings}')
    .onCreate((change, context) => {
        const doc = admin.firestore().collection('users').doc(context.params.uid).collection('user').doc('trainings');
        const trainingsID = change.data().trainingsID;
        const trainingsName = change.data().training;
        const trainingsTimestamp = change.data().timestamp;

        doc.update({
            Trainings: {
                ...doc.Trainings,
                [trainingsID]: {
                    'trainingsName': trainingsName,
                    'trainingsDate': trainingsTimestamp,
                },
            },
        })

    });

这是我在 Franks 回答后更新的代码:

    exports.addTrainingtoList = functions.firestore
        .document('/users/{uid}/trainings/{trainings}')
        .onCreate((change, context) => {
            const doc = admin.firestore().collection('users').doc(context.params.uid).collection('user').doc('trainings');
            const trainingsID = change.data().trainingsID;
            const trainingsName = change.data().training;
            const trainingsTimestamp = change.data().timestamp;
    
            const nameField = trainingsID + ".trainingsName";
            const timestampField = trainingsID + ".trainingsDate";
            doc.update({
               Trainings: {
                    ...doc.Trainings,
                    [nameField]: trainingsName,
                    [timestampField]: trainingsTimestamp,
                   },
              })
    
        });

当前地图被覆盖。

在这里你可以看到我得到了什么:

在这里你可以看到我想要的。

提前致谢。

为了 add nested fields in an object 使用点符号,像这样:

const nameField = trainingsID + ".trainingsName";
const timestampField = trainingsID + ".trainingsDate";
doc.update({
    Trainings: {
        ...doc.Trainings,
        [nameField]: trainingsName,
        [timestampField]: trainingsTimestamp,
    },
})

由于您更新了问题以显示您想要获得的内容,因此可以通过以下方式完成:

const trainingsID = change.data().trainingsID + Date.now();

然后你的原始代码更新文档。

在 Franks 的帮助下,我终于找到了解决问题的方法。

exports.addTrainingtoList = functions.firestore
.document('/users/{uid}/trainings/{trainings}')
.onCreate((change, context) => {
    const doc = admin.firestore().collection('users').doc(context.params.uid).collection('user').doc('trainings');
    const trainingsID = change.data().trainingsID;
    const trainingsName = change.data().training;
    const trainingsTimestamp = change.data().timestamp;

    const nameField = `trainings.${trainingsID}.trainingsName`;
    const dateField = `trainings.${trainingsID}.trainingsDate`;

    doc.update({

        [nameField]: trainingsName,
        [dateField]: trainingsTimestamp,
    })

});

这是结果:

如果您最终想从地图中删除值,您可以使用:

exports.delTrainingtoList = functions.firestore
.document('/users/{uid}/trainings/{trainings}')
.onDelete((change, context) => {
    const doc = admin.firestore().collection('users').doc(context.params.uid).collection('user').doc('trainings');
    const trainingsID = change.data().trainingsID;
    const trainingsName = change.data().training;
    const trainingsTimestamp = change.data().timestamp;

    const trainingsField = `trainings.${trainingsID}`;


    doc.update({

        [trainingsField]: FieldValue.delete(),
    })

});