如何查询包含数组且数组值为[“ val1”,“ val2”] Firestore

时间:2020-03-26 12:38:55

标签: firebase google-cloud-firestore

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

文档示例:我想知道如何查询品牌为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弄清楚如何获得它。

1 个答案:

答案 0 :(得分:0)

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

编辑:

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

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