当前位置: 首页 > 面试题库 >

如何使用Firestore更新“对象数组”?

谯阳伯
2023-03-14
问题内容

我目前正在尝试使用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的官方文件: 我想使用动态键而不是颜色。 这当然是不可能的,并且会引发错误。 我一直在尝试这样做: 它实际上是用正确的键进行更新,但不幸的是,它正在覆盖其他键(它们正在被删除)。