无法删除键名称中带有句点的字段

Rya*_*ler 1 javascript google-cloud-firestore

我已经尝试了另一个 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)
    })
Run Code Online (Sandbox Code Playgroud)

查看控制台,打印了accounts.www.stackoverflow.com:

在此输入图像描述

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

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

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

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

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

OP Sandeep Dinesh 发布的这段代码(在评论中)根本不起作用,即使在尝试使用不带句点的密钥进行删除时也是如此。我的代码如下,返回的 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)
    })
Run Code Online (Sandbox Code Playgroud)

Dou*_*son 5

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

您需要在此处使用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()
);
Run Code Online (Sandbox Code Playgroud)