I am trying to run this code:
function updateUserLimitations(userId, limitations, batchOrTransaction = undefined) {
const userLimitationsRef = firestore
.collection("users")
.doc(userId)
.collection("limitations")
.doc("userLimitations");
if (batchOrTransaction) {
return batchOrTransaction.set(
userLimitationsRef,
limitations,
{ merge: true }
);
}
return userLimitationsRef.set(limitations, { merge: true });
}
updateUserLimitations(userId, { "messages.totalMessages": admin.firestore.FieldValue.increment(1) });
But...
Instead of getting this doc data in my db:
{ // Doc data
messages: {
initialDate: timestamp, // Date of the first message (I need to preserve it),
totalMessages: 20,
},
}
I am getting:
{
...other doc data...,
messages.totalMessages: 20,
}
I need the set with the merge option, because I am updating and creating if the doc doesn't exist....
Any ideas? Am I doing something wrong here?
You can use an object for "setting" nested data:
{
messages: {
totalMessages: 20,
}
}
The "dot" notation is for applying updates to nested data.
If you need only to update, then use the update() function instead of set(). So please change the following line of code:
return userLimitationsRef.set(limitations, { merge: true });
To:
return userLimitationsRef.update(limitations);
And your:
updateUserLimitations(userId, { "messages.totalMessages": admin.firestore.FieldValue.increment(1) });
It will work as expected. If you want to add if it doesn't exist, then you should indeed use the set() function.
With my current implementation
function updateUserLimitations(userId, limitations, batchOrTransaction = undefined) {
const userLimitationsRef = firestore
.collection("users")
.doc(userId)
.collection("limitations")
.doc("userLimitations");
if (batchOrTransaction) {
return batchOrTransaction.set(
userLimitationsRef,
limitations,
{ merge: true }
);
}
return userLimitationsRef.set(limitations, { merge: true });
}
I can deeply update the document messages field too, as follows:
updateUserLimitations(
userId,
{
messages: {
totalMessages: admin.firestore.FieldValue.increment(1),
}
}
);
It preserves all the previous existing object fields and updates the specific one.
{ // Doc data
messages: {
initialDate: timestamp, // PRESERVED!
totalMessages: 21,
},
}