作者:mobiledu2502889257 | 来源:互联网 | 2023-05-16 19:09
我正在尝试Firestore,而且我遇到了一些非常简单的事情:“更新一个数组(也就是一个子文档)”.我的DB结构非常简单.例如:proprietary:JohnDoeshare
我正在尝试Firestore,而且我遇到了一些非常简单的事情:“更新一个数组(也就是一个子文档)”.
我的DB结构非常简单.例如:
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() }] })
没有用.
这些查询会覆盖我的数组.
答案可能很简单,但我找不到……
谢谢
解决方法:
编辑08/13/2018:现在支持Cloud Firestore中的本机阵列操作.见下面的Doug’s answer.
目前无法在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()调用非常相似,但是如果update()调用失败,则调用set()时会创建文档(如果它不存在).
所以你有两个选择来实现你想要的.
选项1 – 设置整个阵列
使用数组的全部内容调用set(),这将需要首先从数据库中读取当前数据.如果您担心并发更新,则可以在事务中执行所有这些操作.
选项2 – 使用子集合
您可以使sharedWith成为主文档的子集合.然后
添加单个项目将如下所示:
firebase.firestore()
.collection('proprietary')
.doc(docID)
.collection('sharedWith')
.add({ who: "third@test.com", when: new Date() })
当然,这带来了新的局限性.你将无法查询
文件基于他们与谁分享,你也不能
在单个操作中获取doc和所有sharedWith数据.