Reputation: 105
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:
Here u can see what I want to have.
Thanks in advance.
Upvotes: 0
Views: 588
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:
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
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