我尝试更新/删除Firestore文档中的字段,但是有一个"句点"在尝试更新/删除它们时,名称似乎无声地失败。我有句点的原因是我使用URL作为对象中的键,我觉得这是一个半常见的用例。
示例:
首先创建文档(这很好)
db.collection("data").doc("temp").set({
helloworld: {
key1: 'foo'
},
hello.world: {
key1: 'bar'
}
})
如果您尝试删除没有句点的元素,它可以正常工作。
db.collection("data").doc("temp").update({
helloworld: firebase.firestore.FieldValue.delete()
})
// Value is Deleted
如果您尝试删除没有句点的元素,它就不会做任何事情。
db.collection("data").doc("temp").update({
hello.world: firebase.firestore.FieldValue.delete()
})
// Nothing Happens!
我也试过
let u = {}
u['hello.world'] = firebase.firestore.FieldValue.delete()
db.collection("data").doc("temp").update(u)
// Nothing Happens!
这是一个错误吗?是否支持字段名称中的句点?看起来很奇怪我可以创建元素但不能删除它。
答案 0 :(得分:5)
更新操作正在读取hello.world
,作为一个点分隔的路径,指向一个名为word
的字段,其嵌套方式如下:
{
hello: {
world: "Some value"
}
}
如果您的名称中有一个点的字段,则需要使用FieldPath
在更新中直接引用它:
https://firebase.google.com/docs/reference/js/firebase.firestore.FieldPath
所以这就是你想要的:
doc.update(
firebase.firestore.FieldPath("hello.world"),
firebase.firestore.FieldValue.delete());
答案 1 :(得分:3)
当您在更新时使用名称中的句点或删除时,您需要将其包装在引号中:
db.collection("data").doc("temp").update({
"hello.world": firebase.firestore.FieldValue.delete()
})
或动态名称:
[`hello.${world}`]: firebase.firestore.FieldValue.delete()
答案 2 :(得分:1)
没有其他答案对我有用,最接近的答案缺少new()
关键字,这是对我有用的
let fpath = new firestore.firestore.FieldPath(`hello.${world}`);
doc.update(
fpath,
firestore.firestore.FieldValue.delete()
);
答案 3 :(得分:0)
如果您使用动态密钥并且J Livengood的解决方案对您不起作用,我找到了解决方法。你可以使用" set"方法用"合并:真"用删除值选择性地设置密钥。
var dynamicKey = "hello.world"
// ES6
db.collection("data").doc("temp").set({
[dynamicKey]: firebase.firestore.FieldValue.delete()
}, { merge: true })
// ES5
var obj = {}
obj[dynamicKey] = firebase.firestore.FieldValue.delete()
db.collection("data").doc("temp").set(obj, { merge: true })