我目前正在尝试 Firestore,但我遇到了一些非常简单的问题:“更新数组(又名子文档)”。
我的数据库结构非常简单。例如:
proprietary: "John Doe", sharedWith: [ {who: "first@test.com", when:timestamp}, {who: "another@test.com", when:timestamp}, ],
我正在尝试(没有成功)将新记录推送到shareWith对象数组中。
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: new Date() }但不影响任何现有文档属性。update()它与您提供的调用非常相似,但是set()如果文档不存在,则调用将创建文档,而update()调用将失败。
proprietary/docID
sharedWith = [{ who: "third@test.com", when: new Date() }
update()
set()
所以你有两种选择来实现你想要的。
选项 1 - 设置整个数组
调用set()数组的全部内容,这将需要首先从数据库中读取当前数据。如果您担心并发更新,您可以在事务中完成所有这些操作。
选项 2 - 使用子集合
您可以制作sharedWith主文档的子集合。然后添加单个项目将如下所示:
sharedWith
firebase.firestore() .collection('proprietary') .doc(docID) .collection('sharedWith') .add({ who: "third@test.com", when: new Date() })
当然,这带来了新的限制。您将无法根据与谁共享文档来查询文档,也无法sharedWith在一次操作中获取文档和所有数据。