【问题标题】:Cannot Delete Fields with Period in Key Name无法删除键名中带有句点的字段
【发布时间】:2020-11-12 23:45:45
【问题描述】:

我已经尝试了this 其他 StackOverflow 线程中的所有解决方案,但没有一个对我有用。在这一点上,我完全被难住了,不知道下一步该尝试什么。

我试图访问的数据是这样的:

我尝试使用的键是一个 URL,它位于帐户映射中。这是我正在运行以尝试删除密钥的代码:

var userRef = db.collection('userAccounts').doc(userEmail)
let dynamicKey = `accounts.${accountURL}`

console.log(dynamicKey)

userRef.set({
    [dynamicKey]: firebase.firestore.FieldValue.delete()
}, { merge: true})
    .then((result) => {
        console.log(result)
    })
    .catch((error) => {
        console.log(error)
    })

查看控制台,accounts.www.stackoverflow.com 被打印出来:

所以,看起来路径应该匹配。需要注意的是,没有句点的 URL 可以正常工作,所以看起来路径是正确的,而句点实际上是问题所在。

J Livengood 接受的答案根本不适用于名称中带有句点的键:

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

Sam Stern 发布的代码根本无法运行,并且我收到一条错误消息,指出更新只需要一个参数。与上一张海报(ishandutta2007)相反,在 FieldPath 之前添加“新”并不能修复错误:

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

OP,Sandeep Dinesh 发布的这段代码(在 cmets 中)根本不起作用,即使尝试使用没有句点的键删除也是如此。我的代码如下,返回的 Promise 在代码的“then”部分未定义:

var userRef = db.collection('accounts').doc(userEmail)
let dynamicKey = `accounts.${accountURL}`

userRef.set({
    [dynamicKey]: firebase.firestore.FieldValue.delete()
}, { merge: true})
    .then((result) => {
        console.log(result)
    })
    .catch((error) => {
        console.log(error)
    })

【问题讨论】:

  • 如果您的代码无法正常工作,您应该指出具体的错误消息是什么,或者解释代码实际执行的操作与您的预期不同。确保您的代码确实检查了错误。 set() 返回一个您必须检查是否成功的承诺。我们应该能够获取您所拥有的并重现该行为。说“它不起作用”是不够的。
  • @DougStevenson 我已经更新了帖子。返回的承诺只是未定义的,这根本没有帮助。请注意,这个未定义的 Promise 会打印在成功的“then”部分,因此根本不会返回任何错误。
  • 关键是要知道它不会产生错误。 update() 也是一样。
  • 您能否说明您作为`accounts.${accountURL}` 传递的实际字符串与文档中的内容相匹配?我们应该看到一切都按照您期望的方式排列。您的问题应包含足够的信息,以便任何人都可以重现整个情况。这里有很多事情可能会出错,这可能不是您所期望的。我强烈建议阅读:stackoverflow.com/help/minimal-reproducible-example
  • 当然。本质上,URL 被用作地图中的键。因此,accountURL 可能类似于www.stackoverflow.com。用于删除的变量是 let dynamicKey = 'accounts.${accountURL}'。将此记录到控制台,将打印accounts.www.stackoverflow.com。这与 Firestore 中存储的内容相匹配。这对于我尝试的任何 URL 都是可重复的。一个重要的注意事项是,此代码成功地删除了没有句点的“URL”。例如,像abcd 这样的 URL 被删除就好了。

标签: javascript google-cloud-firestore


【解决方案1】:

您在这里遇到的问题与您描述的有点不同。具体来说,您正在尝试删除其中包含句点的 嵌套映射键。重要的是要意识到这种嵌套需要特殊处理,而其他问题只处理顶级字段。

您需要在此处使用FieldPath,并在构造函数中将字段的路径指定为数组元素。来自链接的 API 文档(重点是我的):

根据提供的字段名称创建一个 FieldPath。如果提供了多个字段名称,则路径将指向文档中的嵌套字段

因此,您应该使用new firebase.firestore.FieldPath(["accounts", "www.stackoverflow.com"]) 字段和firebase.firestore.FieldValue.delete() 值进行设置或更新。

documentReference.update(
  new firebase.firestore.FieldPath(["accounts", "www.stackoverflow.com"]), 
  firebase.firestore.FieldValue.delete()
);

【讨论】:

    猜你喜欢
    • 2018-05-27
    • 1970-01-01
    • 1970-01-01
    • 2017-07-31
    • 2021-08-01
    • 1970-01-01
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多