【发布时间】: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。请注意,in和array-contains-any运算符之间存在细微差别,因为in匹配数组长度、顺序和值的精确匹配。 -
@sllopis,但这样我将不得不浏览大量不需要的文档,从而增加查询的大小。
-
@sllopis,因为 array-contains-any 只寻找一个满足测试的元素
标签: firebase google-cloud-firestore