我目前正在尝试使用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:newDate()}但是不会影响现有的文档属性。这与update()您提供的set()呼叫非常相似,但是,如果文档不存在,则创建文档的update()呼叫将失败。
proprietary/docID
sharedWith=[{who:"third@test.com",when:newDate()}
update()
set()
因此,您有两种选择来实现所需的目标。
选项1-设置整个数组
调用set()数组的全部内容,这将需要首先从DB中读取当前数据。如果您担心并发更新,则可以在事务中完成所有这些操作。
选项2-使用子集合
您可以sharedWith对主文档进行子集合。然后添加单个项目将如下所示:
sharedWith
firebase.firestore() .collection('proprietary') .doc(docID) .collection('sharedWith') .add({ who: "third@test.com", when: new Date() })
当然,这带来了新的限制。您将无法基于共享对象来查询文档,也无法sharedWith通过单个操作获取文档和所有数据。