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)
您在这里遇到的问题与您描述的有点不同。具体来说,您正在尝试删除其中包含句点的嵌套映射键。重要的是要认识到这种嵌套需要特殊处理,这是您在其他问题中没有看到的,这些问题仅处理顶级字段。
您需要在此处使用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)
| 归档时间: |
|
| 查看次数: |
113 次 |
| 最近记录: |