I am trying to delete a field inside a Firestore document using the KeyPath method.
In other words, I am converting the request body into keyPath string.
Example, converting the below request body:
{ "preferences": { "settings":{ "v1.4.3": [ "apple" ] } } }
Into keyPath: "preferences.settings.v1.4.3"
and then using this keyPath to delete the path using the following method
await userRef.update({ "preferences.settings.v1.4.3": admin.firestore.FieldValue.delete(), lastUpdated: timestamp, });
This would work normally if the keyPath string doesn’t contains dots.
However if it contains it’s assuming the v1
is an object that contains a field with key 4
.
I tried to delete the field using the set
function as well(see example below) but it didn’t seem to work
await userRef.set( { { "preferences": { "settings":{ "v1.4.3": null } } }, lastUpdated: timestamp, }, { merge: true } );
Please how to solve this issue.
Advertisement
Answer
The update
operation interprets dots (.
) as indications that there are subfields.
Your options to write to a field that has literal dots in its name are to:
- Use
set
/setDoc
, which does not interpret dots as separators. If you want to update a subset of the document, pass{ merge: true}
as shown in the second code sample here. - Use a
FieldPath
object for the field name, rather than just the string value.