小编典典

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

all

我目前正在尝试 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() }] })

没有工作。这些查询会覆盖我的数组。

答案可能很简单,但我找不到它......


阅读 71

收藏
2022-08-27

共1个答案

小编典典

目前无法在 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: new Date() }但不影响任何现有文档属性。update()它与您提供的调用非常相似,但是set()如果文档不存在,则调用将创建文档,而update()调用将失败。

所以你有两种选择来实现你想要的。

选项 1 - 设置整个数组

调用set()数组的全部内容,这将需要首先从数据库中读取当前数据。如果您担心并发更新,您可以在事务中完成所有这些操作。

选项 2 - 使用子集合

您可以制作sharedWith主文档的子集合。然后添加单个项目将如下所示:

firebase.firestore()
  .collection('proprietary')
  .doc(docID)
  .collection('sharedWith')
  .add({ who: "third@test.com", when: new Date() })

当然,这带来了新的限制。您将无法根据与谁共享文档来查询文档,也无法sharedWith在一次操作中获取文档和所有数据。

2022-08-27