LazyTurtle
LazyTurtle

Reputation: 105

Google Cloud Functions Add values to a map in firestore

This is my code to add values to a map in firestore. At the moment the map gets overwritten everytime

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

    });

This is my updated code after Franks answer:

    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,
                   },
              })
    
        });

Currently the map is overwritten.

Here u can see what I get:

enter image description here

Here u can see what I want to have.

enter image description here

Thanks in advance.

Upvotes: 0

Views: 588

Answers (2)

LazyTurtle
LazyTurtle

Reputation: 105

Finally with Franks help I found a solution for my problem.

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

});

This is the result:

enter image description here

If you finally want to delete values out of the map you can use:

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(),
    })

});

Upvotes: 1

Frank van Puffelen
Frank van Puffelen

Reputation: 598728

To add nested fields in an object use dot notation like this:

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

Since you updated your question to show what you want to get, that can be accomplished with:

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

And then your original code to update the document.

Upvotes: 1

Related Questions