我目前正在尝试使用Firestore,但遇到了非常简单的问题:“更新数组(又称子文档)”。
我的数据库结构非常简单。例如:
proprietary: "John Doe",
sharedWith:
[
{who: "first@test.com", when:timestamp},
{who: "another@test.com", when:timestamp},
],
我正在尝试(没有成功)将新记录推入shareWith
对象数组。
我试过了:
// With SET
firebase.firestore()
.collection('proprietary')
.doc(docID)
.set(
{ sharedWith: [{ who: "third@test.com", when: new Date() }] },
{ merge: true }
)
// With UPDATE
firebase.firestore()
.collection('proprietary')
.doc(docID)
.update({ sharedWith: [{ who: "third@test.com", when: new Date() }] })
没有效果。这些查询将覆盖我的数组。
答案可能很简单,但我找不到它…
当前无法在Cloud Firestore中更新单个数组元素(或添加/删除单个元素)。
这段代码在这里:
firebase.firestore()
.collection('proprietary')
.doc(docID)
.set(
{ sharedWith: [{ who: "third@test.com", when: new Date() }] },
{ merge: true }
)
这是说,在设置文件proprietary/docID
,使得sharedWith=[{who:"third@test.com",when:newDate()}
但是不会影响现有的文档属性。这与update()
您提供的set()
呼叫非常相似,但是,如果文档不存在,则创建文档的update()
呼叫将失败。
因此,您有两种选择来实现所需的目标。
选项1-设置整个数组
调用set()
数组的全部内容,这将需要首先从DB中读取当前数据。如果您担心并发更新,则可以在事务中完成所有这些操作。
选项2-使用子集合
您可以sharedWith
对主文档进行子集合。然后添加单个项目将如下所示:
firebase.firestore()
.collection('proprietary')
.doc(docID)
.collection('sharedWith')
.add({ who: "third@test.com", when: new Date() })
当然,这带来了新的限制。您将无法基于共享对象来查询文档,也无法sharedWith
通过单个操作获取文档和所有数据。
问题内容: 我读过这篇文章和同一个人的这篇文章,说您无法更新数组元素。 我还阅读了最近的一篇文章,有人说可以用某种方式完成此操作,但是我在文档中都无法获得有关stackoverflow的任何信息。 有什么办法可以解决这个问题?谢谢! 问题答案: 实际上,写这些答案的“家伙”是我:)那时,还没有一种更新数组元素的方法。只能存储数组,而 不能 更新数组成员。 现在,在更新文档时,您可以将第二个参数传递
我有一系列推车。我想更新请求对象中的产品数量。即。 我有一个数组的产品和数量,比如: 我想更新它们,如: 这可能的逻辑是什么?
假设我们有以下集合,我对此没有什么问题: > 我想增加“item_name”的价格:“my_item_two”,如果它不存在,应该将它追加到“items”数组中。
问题内容: 我有一个像这样的JSON字符串: 我想将属性更新为,如果值为,并且值为。 我已经到了这一点,但是不确定如何进行: 我不知道怎么去的是一个孩子。 提前致谢。任何指针都很棒。 问题答案: 您可以使用属性作为键来访问对象: 对于您的示例,请尝试:
问题内容: 如何使用javascript或jQuery动态更新以下JSON对象? 我想将用户名动态更新为“ Id”为“ 3”的“ Thomas”。 我该如何实现? 问题答案: 一个简单的JavaScript解决方案,假定已经包含JSON: 在其上循环查找匹配的ID,设置相应的用户名,并在修改了匹配项之后从循环中进行查找: 它在jsFiddle上。 这是包装在函数中的同一件事:
遵循firestore的官方文件: 我想使用动态键而不是颜色。 这当然是不可能的,并且会引发错误。 我一直在尝试这样做: 它实际上是用正确的键进行更新,但不幸的是,它正在覆盖其他键(它们正在被删除)。