无法在名称中使用"句点"更新/删除Firestore字段

San*_*esh 8 javascript google-cloud-firestore

我正在尝试更新/删除Firestore文档中的字段,但是在尝试更新/删除它们时,名称中具有"句点"的字段似乎无声地失败.我有句号的原因是我使用URL作为对象中的键,我觉得这是一个半常见的用例.

例:

首先创建文档(这很好)

db.collection("data").doc("temp").set({
  helloworld: {
      key1: 'foo'
  },
  hello.world: {
      key1: 'bar'
  }
})
Run Code Online (Sandbox Code Playgroud)

如果您尝试删除没有句点的元素,它可以正常工作.

db.collection("data").doc("temp").update({
    helloworld: firebase.firestore.FieldValue.delete()
})
// Value is Deleted
Run Code Online (Sandbox Code Playgroud)

如果您尝试删除没有句点的元素,它不会执行任何操作.

db.collection("data").doc("temp").update({
    hello.world: firebase.firestore.FieldValue.delete()
})
// Nothing Happens!
Run Code Online (Sandbox Code Playgroud)

我也试过了

let u = {}
u['hello.world'] = firebase.firestore.FieldValue.delete()
db.collection("data").doc("temp").update(u)
// Nothing Happens!
Run Code Online (Sandbox Code Playgroud)

这是一个错误吗?是否支持字段名称中的句点?我可以创建元素但不删除它似乎很奇怪.

J L*_*ood 5

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

db.collection("data").doc("temp").update({
  "hello.world": firebase.firestore.FieldValue.delete()
})
Run Code Online (Sandbox Code Playgroud)

或动态名称:

[`hello.${world}`]: firebase.firestore.FieldValue.delete()
Run Code Online (Sandbox Code Playgroud)


Sam*_*ern 5

更新操作是hello.world作为一个点分隔的路径读取到一个word被嵌套的字段,如下所示:

{
  hello: {
   world: "Some value"
  }
}
Run Code Online (Sandbox Code Playgroud)

如果您的名称中包含一个点的字段,则需要使用该字段FieldPath在更新中引用它:https: //firebase.google.com/docs/reference/js/firebase.firestore.FieldPath

所以这就是你想要的:

doc.update(
  firebase.firestore.FieldPath("hello.world"), 
  firebase.firestore.FieldValue.delete());
Run Code Online (Sandbox Code Playgroud)