在Firebase中如何从嵌套文档中删除一个数组项?

10

我正在开发一个Vue、Firebase应用程序,将用户事件保存在Firebase集合中,当用户安排事件时,我会更新这个userevents数组,并在用户取消或删除事件时将其删除。

users(collection) -
 test123(document) -
      "id" . --fields
      "username" . --fields
      "userevents" . --array
         [0]
            "eventid"
            "date"
            "desc"
            "status"
         [1]
            "eventid"
            "date"
            "desc"
            "status"

从用户界面(UI)来看,如果用户取消一个事件,我将拥有该事件的ID并希望从userevents数组中删除它。 我尝试使用以下代码从数组中删除项目,但它会删除所有userevents的项目,

userRef.update({
    eventid: firebase.firestore.FieldValue.delete()
});

在 Firebase 中有实现这个的方法吗?

1个回答

28

目前Firestore不支持仅使用数组元素中的字段(在您的情况下为eventid)删除数组中的元素。有几种解决方法:

方法1

您可以使用FieldValue.arrayRemove根据值从数组中删除元素。该值必须与数组中的整个元素匹配,并且将删除所有与该值匹配的元素。您可以在此处了解更多相关信息,以及操作数组的一般性内容。由于您的数组元素是对象,因此代码看起来像这样:

userRef.update({
    "userevents": firebase.firestore.FieldValue.arrayRemove({"eventid": ..., "date": ..., "desc":..., "status":...})
});

方法2

您当前正在将对象存储在数组中。您可以将userevents更改为映射(对象),而不是数组。假设eventid是唯一的,您可以通过eventid索引地图,然后像这样从地图中删除条目:

userRef.update({
    ['userevents.' + eventid]: firebase.firestore.FieldValue.delete()
});

我尝试了你的方法2,但它没有从userevents映射中删除密钥。我认为根据上述语法,eventid被视为字符串而不是变量。 "userevents.${eventid}": firebase.firestore.FieldValue.delete() }); ``` - Annette
抱歉,这个应该可以工作:userRef.update({ ['userevents.' + eventid]: firebase.firestore.FieldValue.delete() }); 我也会更新答案。 - clk
1
另一个选项是从Firestore读取数组,从特定索引中删除项目,然后编写更新后的项目。 - secretshardul
假设数组中的值是double类型,那么FieldValue.arrayRemove必须匹配到最后一位精度的整个double值,这很麻烦。我要求按索引删除。 - iCantC
2022年云更新:请注意,导入已更改为 FirebaseFirestore.FieldValue.arrayRemove({}); - Paul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接