Firestore如何获取某个字段值不在数组中的文档?

22

是否有一种方法可以获取所有不包含一个或多个值的数组字段文档,现在有 "array-contains",但是否有类似于 "array-not-contains" 的东西?


尝试使用 array-contains ""。 - Jeff Padgett
@JeffPadgett 这将返回所有数组字段包含空字符串值的文档。这在这里行不通。 - Doug Stevenson
我的错误,误读了问题。 - Jeff Padgett
3个回答

12

您只能基于索引来查询Firestore,因此查询可以在不影响性能的情况下扩展到数十亿个文档。

索引的工作原理是记录存在于数据集中的值。如果索引跟踪不存在的内容,那么它就不可能高效。这是因为与您的数据集相比,不存在值的宇宙非常大,不能像索引数据一样被索引。查询某些值的不存在将需要扫描所有文档,并且这种方法无法进行规模化操作。


14
我理解您的陈述,但这也意味着有些事情是不可能的。例如,如何向用户展示他尚未看到的用户列表?就像Tinder一样,您会展示那些还没有“匹配”的人,然后存储您匹配或忽略的人,但是您不能记录(并创建索引)所有您尚未匹配的人。即使只有相对较少的用户(超过10,000),您也将拥有超过10亿条记录。我不知道我所说的是否有意义,但我没能在Firebase中找到一种表示这种关系的方法。 - FrenchTastic
1
如果你想记录尚未被执行的操作,只需分配一个已知值来指示该操作在文档创建时被索引。例如 hasDoneSomething = false。然后,在执行该操作时,将其设置为 true。您必须事先知道要索引的内容。 - Doug Stevenson
亲爱的,您能详细阐述一下您在这里提出的“hasDoneSomething = false”方法吗? - Mechanic

5
我认为目前这是不可能的。你可以参考这篇博客文章:Cloud Firestore更好的数组
你可能需要将你的数组转换成对象,这样你就可以查询 (property === false),如下图所示:Convert array to object

6
即使使用 property === false 进行查询,如果该属性不存在,也不会返回结果。 - Ced
这个方法可以正常工作,除非你的数组元素是动态的、具有任意值。如果你对多个字段进行查询,由于索引问题,这个方法将会失败。 - l1b3rty

0
考虑到您的集合将包含少量文档,您可以使用onCreate云函数触发器将它们所有的id存储在另一个文档中,在客户端下载此文档并在客户端进行过滤。如果您担心性能问题,也可以在云函数中执行所有这些操作。
您会多读取1次,但这并不是什么大问题,每个文档最多可以有1 MB的存储空间,所以您不必过于担心。如果它们变得太大,您还可以将这些id分成不同的文档,并在客户端/云函数上合并它们。
这对小型数据集非常有效,但是如果您预计有数百万个文档,则没有太多可以做的了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接