代码之家  ›  专栏  ›  技术社区  ›  gon250

如何查询包含数组且数组值为[“val1”、“val2”]Firestore的文档

  •  0
  • gon250  · 技术社区  · 4 年前

    如何获取查询应适用于文档内数组的集合。

    文档示例:我想知道如何查询品牌所在的文档 fiat seat

    {
       "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 如何得到这个。

    0 回复  |  直到 4 年前
        1
  •  0
  •   Alex Mamo    4 年前

    当使用 array-contains-any 运算符,则可以对照字符串和类型的属性的值检查数组的值 数组。目前您无法使用 数组包含任何 数组上的运算符。有两个选项,一个是创建两个单独的字段并创建两个单独的查询,或者,如果只是一个文档,您可以获取整个文档并在客户端上过滤数据。

    编辑:

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

    您试图实现的是不使用当前的数据库结构,因为 slug 属性存在于嵌套在数组中的实际对象中的对象中。一种可能的解决方案可能是复制一些数据,只将所需的值添加到数组中,并使用 数组包含任何 此新创建的数组上的运算符。