【问题标题】:FieldValue.arrayRemove() to remove an object from array of objects based on property valueFieldValue.arrayRemove() 根据属性值从对象数组中删除对象
【发布时间】:2020-04-28 21:16:42
【问题描述】:

我有一个结构如下的文档:

{
    "email" : "a@gmail.com",
    "value" : 100,
    "children" : [
                  {
                    "email" : "b@gmail.com",
                    "value" : 100
                  },
                  {
                    "email" : "b@gmail.com",
                    "value" : 200
                  }
                 ]
}

我想从children 数组中删除所有带有电子邮件b@gmail.com 的元素。如果我像这样传递要删除的整个对象,则可以删除一项:

FieldValue.arrayRemove(childObject)

但我希望删除带有电子邮件 b@gmail.com 的两个对象。无论如何使用FieldValue.arrayRemove() 来实现这一点?

【问题讨论】:

    标签: firebase flutter dart google-cloud-firestore


    【解决方案1】:

    arrayRemove 操作会从数组中删除您指定的确切项目。无法传递部分对象并删除与部分信息匹配的所有数组项。您必须传入要删除的每个完整项目。

    如果您还不知道这些项目是什么,您通常必须先读取文档,循环遍历数组中的项目以删除它们,然后将修改后的数组写回文档。

    【讨论】:

    • 以后有可能支持这个功能吗?
    • 目前没有人积极致力于添加部分数组操作。如果您想投票支持他们被添加,您可以file a feature request。但是现在,您必须先查询然后删除。
    【解决方案2】:

    作为更新,您仍然必须完全匹配对象才能将其从数组中删除。此外,当然,在上面的示例中,他正在查询一个值,这需要查询以查看匹配的内容。

    但是,根据逻辑:如果您使用 Map 代替...例如在上述情况下,调整:

    "children" : 
        "b@gmail.com_100":
                          {
                            "email" : "b@gmail.com",
                            "value" : 100
                          },
        "b@gmail.com_200":
                          {
                            "email" : "b@gmail.com",
                            "value" : 200
                          }
                 
    

    你可以简单地使用:

    'children.b@gmail.com_200': FieldValue.delete(), 
    

    最近,出于这个原因,我已经从列表转向地图。

    【讨论】:

    • 您好,我想将这个 'children.b@gmail.com_200' 更改为 'children.${mail}',但不确定语法是否正确,您能帮我解决一下吗?
    • String var = 'b@gmail.com_200'; 'children.$var' 应该这样做。
    • 不幸的是,这不起作用:/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-08
    • 2015-12-07
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    • 2013-02-23
    相关资源
    最近更新 更多