Firebase Firestore:从文档数组中追加/删除项目

时间:2017-10-25 22:39:02

标签: arrays swift firebase dictionary google-cloud-firestore

我试图在Firestore文档中的数组中追加/删除项目,但每次更换整个数组而不是追加新值。我尝试了以下两种方法:

batch.setData(["favorites": [user.uid]], forDocument: bookRef, options: SetOptions.merge())

batch.updateData(["favorites": [user.uid]], forDocument: bookRef)

我知道我可以使用对象/字典来代替数组,但这意味着存储不相关的其他数据(例如密钥),我需要的只是存储在数组中的ID。这是Firestore目前可以实现的吗?

3 个答案:

答案 0 :(得分:4)

实际上,如今是可能的。最新更新db.collection.updateData 方法实际上将新项目追加到数组,而不是替换它。 用法示例可以在Firebase documentation

中找到

答案 1 :(得分:2)

不。这是不可能的。

在Cloud Firestore这样的环境中,阵列往往会出现问题,理论上很多客户端可以在同一时间附加或删除数组中的元素 - 如果指令以稍微不同的顺序到达,则最终可能会超出边界错误,数据损坏,或者只是一个非常糟糕的时间。因此,您需要使用字典(您可以在其中指定单个键)或替换整个数组。

答案 2 :(得分:1)

更新数组中的元素

如果文档包含数组字段,则可以使用arrayUnion()和arrayRemove()添加和删除元素。 arrayUnion()将元素添加到数组,但仅不存在的元素。 arrayRemove()删除每个给定元素的所有实例。

let washingtonRef = db.collection("cities").document("DC")

// Atomically add a new region to the "regions" array field.
washingtonRef.updateData([
    "regions": FieldValue.arrayUnion(["greater_virginia"])
])

// Atomically remove a region from the "regions" array field.
washingtonRef.updateData([
    "regions": FieldValue.arrayRemove(["east_coast"])
])

See documentation here