小编典典

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

javascript

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

没有效果。这些查询将覆盖我的数组。

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


阅读 381

收藏
2020-05-01

共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: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通过单个操作获取文档和所有数据。

2020-05-01