Firestore(在数据存储模式下)文档说:
数据存储模式为每个索引对每个唯一的数组属性值索引一次。因此,要查询数组是否包含值,请使用相等过滤器。
此语句意味着您只能使用相等过滤器查询一个值。然而,还有这个例子,其注释如下:
与不等式过滤器不同,多个等式过滤器可用于 查询包含一组值的实体。
Query<Entity> query =
Query.newEntityQueryBuilder()
.setKind("Task")
.setFilter(
CompositeFilter.and(
PropertyFilter.eq("tag", "fun"), PropertyFilter.eq("tag", "programming")))
.build();
我对这个查询能做什么感到困惑。这是否意味着该查询将:
a)返回任务实体,其中“tag”字段是一个数组,并且该数组仅包含值“fun”和“programming”
或/与
b)返回任务实体,其中“标签”字段是一个具有许多不同值的数组(例如
["fun", "programming", "algo", "interview"]
),但其中至少有两个是“有趣”和“编程”?
文档中的示例似乎与 Firestore 中的 array-contains-any 示例类似,但尚不清楚其限制/能力是什么。
您在问题中提供的代码使用两个相等过滤器。因此,查询正在搜索
fun
数组属性中具有值 programming
和 tag
的实体。请记住, CompositeFilter.and() 方法将两个 PropertyFilter.eq()
过滤器组合成一个需要满足两个条件的过滤器。所以这是一个 AND
操作,而不是 OR
。但是,tag
可以包含多个值,而不仅仅是这两个值。