Javascript 无法使用“更新/删除Firestore”字段;句号;以名义

Javascript 无法使用“更新/删除Firestore”字段;句号;以名义,javascript,google-cloud-firestore,Javascript,Google Cloud Firestore,我正在尝试更新/删除Firestore文档中的字段,但名称中有“句点”的字段在尝试更新/删除它们时似乎悄悄失败。我之所以使用句点是因为我使用URL作为对象中的键,我觉得这是一个半常见的用例 例如: 首先创建文档(这很好) 如果尝试删除不带句点的元素,则效果良好 db.collection("data").doc("temp").update({ helloworld: firebase.firestore.FieldValue.delete() }

我正在尝试更新/删除Firestore文档中的字段,但名称中有“句点”的字段在尝试更新/删除它们时似乎悄悄失败。我之所以使用句点是因为我使用URL作为对象中的键,我觉得这是一个半常见的用例

例如:

首先创建文档(这很好)

如果尝试删除不带句点的元素,则效果良好

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!

这是虫子吗?字段名中是否支持句点?很奇怪,我可以创建元素,但不能删除它。

在更新或删除时,在名称中使用句点时,需要将其括起来,如:

db.collection("data").doc("temp").update({
  "hello.world": firebase.firestore.FieldValue.delete()
})
或对于动态名称:

[`hello.${world}`]: firebase.firestore.FieldValue.delete()

更新操作将
hello.world
读取为一个名为
word
的字段的点分隔路径,该字段嵌套如下:

{
  hello: {
   world: "Some value"
  }
}
如果名称中有一个点的字段,则需要使用
FieldPath
在更新中逐字引用该字段:

这就是你想要的:

doc.update(
  firebase.firestore.FieldPath("hello.world"), 
  firebase.firestore.FieldValue.delete());

如果您使用的是动态键,而J Livengood的解决方案不适合您,我找到了一个解决方法。您可以使用带有“merge:true”的“set”方法,有选择地使用delete值设置键

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

其他答案都不适合我,最近的一个答案缺少一个
new()
关键字,以下是适合我的答案

let fpath = new firestore.firestore.FieldPath(`hello.${world}`);
doc.update(
    fpath,
    firestore.firestore.FieldValue.delete()
);

有趣的是,我会尝试一下,如果可行的话,我会把它标记为可接受的答案。奇怪的是,“set”不带引号,但“update”不带引号。set作用于对象形状的数据,update作用于键值形状的数据。不幸的是,我的键是动态的,所以无法提供字符串文本来执行此方法。我得到一个错误:函数DocumentReference.update()需要1个参数,但调用时使用了2个参数。@SandeepDinesh您正在使用web客户端吗?情况不应如此:
let fpath = new firestore.firestore.FieldPath(`hello.${world}`);
doc.update(
    fpath,
    firestore.firestore.FieldValue.delete()
);