无法使用" period"更新/删除Firestore字段在名字里

时间:2017-12-13 20:51:06

标签: javascript google-cloud-firestore

我尝试更新/删除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!

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

4 个答案:

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