【发布时间】: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