【问题标题】:How to query documents where contains an array and the value of the array is ["val1", "val2"] Firestore如何查询包含数组且数组值为 ["val1", "val2"] Firestore 的文档
【发布时间】:2020-03-26 12:38:55
【问题描述】:

如何获得一个集合,其中查询应该适用于文档内的数组。

文档示例:我想知道如何查询品牌为fiatseat的文档

{
   "name":"test 1",
   "brands":[
      {
         "brand":{
            "id":1,
            "name":"Fiat",
            "slug":"fiat",
            "image":null,
            "year_end":null,
            "year_start":null
         },
         "released_at":"2018-10-26"
      },
      {
         "brand":{
            "id":2,
            "name":"Seat",
            "slug":"seat",
            "image":null,
            "year_end":null,
            "year_start":null
         },
         "released_at":"2018-10-26"
      },
      {
         "brand":{
            "id":3,
            "name":"Mercedes",
            "slug":"mercedes",
            "image":null,
            "year_end":null,
            "year_start":null
         },
         "released_at":"2018-10-26"
      },
      {
         "brand":{
            "id":4,
            "name":"Yamaha",
            "slug":"yamaha",
            "image":null,
            "year_end":null,
            "year_start":null
         },
         "released_at":"2018-10-26"
      }
   ]
}

我尝试过类似的方法:

.collection("motors")
.where("brands.slug", "array-contains-any", ["fiat", "seat"])

但这不起作用我无法通过documentation 弄清楚如何获得它。

【问题讨论】:

    标签: firebase google-cloud-firestore


    【解决方案1】:

    使用array-contains-any 运算符时,您可以根据字符串类型的属性值检查数组的值,而不是 数组。目前无法在数组上使用 array-contains-any 运算符。有两种选择,一种是创建两个单独的字段并创建两个单独的查询,或者只是一个文档,您可以获取整个文档并在客户端过滤数据。

    编辑:

    @FrankvanPuffelen 的评论是正确的,我做了一些研究,发现我们可以检查任何类型甚至复杂类型,而不仅仅是字符串,如前所述。解决此问题的关键是匹配整个对象,即该对象的所有属性,而不仅仅是部分匹配,例如三个属性之一。

    您要实现的目标不是使用当前的数据库结构,因为您的 slug 属性存在于一个对象中,该对象嵌套在数组中存在的实际对象中。一种可能的解决方案也可能是复制一些数据并仅将所需的值添加到数组中,并在这个新创建的数组上使用 array-contains-any 运算符。

    【讨论】:

    • 嗨,亚历克斯。您实际上可以检查任何类型甚至复杂类型,而不仅仅是字符串。但是您必须检查数组中项目的完整值,而不是部分匹配。所以你的解决方案是正确的,但你能解释一下为什么他们想要的东西在他们当前的数据结构中是不可能的吗?
    • @FrankvanPuffelen 嘿噗。你是对的。我刚刚更新了我的答案。谢谢。
    • 感谢@AlexMamo,所以我必须解决这个问题的想法是在文档中创建一个新属性,例如 "brandNames":["Fiat", "Seat", "Audi"]能够找到这个..是我能找到的最好的解决方案。现在我的问题是我有超过 400.000 个文档,所以.. 知道如何更新所有文档以从“brands”创建一个新属性“brandNames”。
    • 创建一个数组是一个好主意。如果您需要更新 400.000 个文档,那么您应该考虑使用batch writes。但请注意,每批有 500 次操作的限制。另一种选择是export your database,进行更新并将其上传回服务器。
    • 如果您认为我的回答/评论对未来的 Firebase 开发人员也有帮助,也请考虑投赞成票 (▲)。我真的很感激。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2015-12-04
    • 1970-01-01
    • 2019-08-21
    • 1970-01-01
    • 1970-01-01
    • 2019-01-07
    • 2020-12-30
    相关资源
    最近更新 更多