Firebase:FieldValue.arrayUnion 与对象

ren*_*dom 3 firebase google-cloud-firestore

例如我有一个这样的文档:

team: {
members: [{name: "john", age: 2}, {name: "tim", age: 3}]
}
Run Code Online (Sandbox Code Playgroud)

我想将 Tims 年龄更新为{name: "tim", age: 3}4{name: "tim", age: 4}

我可以使用FieldValue.arrayUnion来做到这一点吗?

因为现在。

...
.update({team: firbase.firestore.FieldValue.arrayUnion({name: "tim", age: 4})})
Run Code Online (Sandbox Code Playgroud)

将创建新条目,团队将像

[
 {name: "john", age: 2}, 
 {name: "tim", age: 3}, 
 {name: "tim", age: 4} <-- duplicate
]
Run Code Online (Sandbox Code Playgroud)

Dou*_*son 7

不,arrayUnion 在这里不起作用。arrayUnion 根据其整个内容认为列表中的每个项目都是唯一的。除非两个对象的所有属性都严格相等,否则它们不被视为相同。这就是为什么您会在列表中获得一个全新的项目 - 年龄不一样,并且 Firestore 无法知道您只希望“名称”是唯一的。

如果要更改数组的内容,则必须读取文档,更改内存中数组的内容,然后将更改后的内容写回文档。交易可能适合于此

另一种想法是:考虑根据出生日期而不是当前年龄来存储年龄。出生日期永远不会改变,并且可以根据与出生日期相关的当前时间来计算年龄。