使用此代码我将覆盖旧数据:
let toUpdate = [book.id]
self.refUsers.child(localUser.key!).child("booksPurchased").setValue(toUpdate, withCompletionBlock: { (error, _) in
答案 0 :(得分:5)
您可以使用以下方法:firebase.firestore.FieldValue.arrayUnion()
angularfire2示例:
this.afs.collection('collection').doc(id).update( {
array: firebase.firestore.FieldValue.arrayUnion( 'newItem' )
});
有关更多信息:https://firebase.google.com/docs/reference/js/firebase.firestore.FieldValue#arrayunion
答案 1 :(得分:3)
在这种情况下,您必须读取现有数据,然后使用添加的新值将其写回。像这样的数组并不总是存储数据列表的最佳方法,如果你想执行大量的追加操作。为此,你最好离开pushing data into a location using childByAutoId。
答案 2 :(得分:0)
读写列表 附加到数据列表
使用 childByAutoId 方法将数据附加到多用户应用程序中的列表。每次将新子项添加到指定的 Firebase 引用时,childByAutoId 方法都会生成一个唯一键。通过为列表中的每个新元素使用这些自动生成的键,多个客户端可以同时将子项添加到同一位置而不会发生写入冲突。 childByAutoId 生成的唯一键基于时间戳,因此列表项会自动按时间顺序排列。
您可以使用childByAutoId方法返回的新数据的引用来获取child自动生成key的值或者为child设置数据。对 childByAutoId 引用调用 getKey 会返回自动生成的密钥。
您可以使用这些自动生成的键来简化数据结构的扁平化。有关详细信息,请参阅数据扇出示例。
-https://firebase.google.com/docs/database/ios/lists-of-data
答案 3 :(得分:-1)
您可以将数组中键的值设置为true
,然后直接在更新中设置值。
因此,如果'newId'是要添加的新项目,则可能类似于:
const update = {
[`/users/${localUser.key}/booksPurchased/${newId}`]: true]
}
firebase.db.ref().udpate(update);
Firebase文档更新示例: https://firebase.google.com/docs/database/web/read-and-write