【问题标题】:Firestore array contains query for list of elementsFirestore 数组包含对元素列表的查询
【发布时间】:2020-03-26 20:52:07
【问题描述】:

我有一个包含如下数组的 Firestore 文档:

Array:                    Array:
[1, 2, 3, 4, 5, 6, 7] or ['Zhangir', 'Erasyl', 'Arman']

我需要检查这个文档是否包含任何给定的数组。例如:

[1, 2, 3, 4] or [1, 2, 7] or ['Zhangir', 'Arman'] and so on

只有在完全匹配时才返回它。但是考虑到我的数组可以有 100 个元素,每次都说arraycontains [1], arraycontains[2]... 会很不方便。有没有办法对很多值进行复合查询? 我找到的所有信息都说我不能,但也许有办法。

在我的例子中是

Firestore.instance.collection("Querys")
.where('array', arrayContains: [1, 2, 3, 4, 5]);

Firestore.instance.collection('Querys')
.where('array', arrayContains: ['Zhangir', 'Arman']);

而不是像

Firestore.instance.collection('Querys')
.where('array', arrayContains: 'Zhangir')
.where('array', arrayContains: 'Arman');

【问题讨论】:

  • docRef.where("myArray", ">=", 1).where("myArray", "<=", 4); 其中docRef 是指向文档的引用,myArray 是文档中的数组字段。更多信息请访问documentation for compound queries
  • @sloppis,它不一定必须是 1、2、3、4,它可以是任何给定的长度和任何给定的序列,例如 [3, 6] 或 [1, 2 , 7] 等等。我更新了问题
  • 嗨@ZhangirSiranov,以前的解决方案只适用于一系列序列,您需要创建一个复合索引。另一方面,对于您当前的用例,我建议使用 array-contains-any 运算符将同一字段上的最多 10 个数组包含子句与逻辑 OR 组合在一起。更多信息可以找到here。请注意,inarray-contains-any 运算符之间存在细微差别,因为 in 匹配数组长度、顺序和值的精确匹配。
  • @sllopis,但这样我将不得不浏览大量不需要的文档,从而增加查询的大小。
  • @sllopis,因为 array-contains-any 只寻找一个满足测试的元素

标签: firebase google-cloud-firestore


【解决方案1】:

Firestore 现在可以检查数组字段的这些条件:

  • 字段是否包含带有array-contains的特定值。
  • 字段是否包含带有array-contains-any 的任何(最多10 个)值列表。

您所描述的是类似array-contains-all 的操作,目前不存在。而且您不能通过组合多个array-contains 检查来创建它,因为您只能在查询中拥有其中一个。你可能想file a feature request

今天最好的选择是:

  1. 从数组中选择一个值,并使用该值执行array-contains 查询。然后在应用代码中进行额外的过滤。
  2. 使用map来存储值,然后使用多个where value == true条件,如本题答案所示:Firestore: Multiple 'array-contains'

【讨论】:

  • 谢谢先生,但如果我这样做,恐怕我要查询很多文件。不过,我将采用不同的解决方案,但仍然感谢。
猜你喜欢
  • 2020-12-30
  • 2019-11-25
  • 1970-01-01
  • 2016-12-05
  • 2014-01-19
  • 2020-01-08
  • 1970-01-01
相关资源
最近更新 更多