【问题标题】:Running != query on Firestore collection group在 Firestore 集合组上运行 != 查询
【发布时间】:2021-06-29 06:05:03
【问题描述】:

我们有一个集合,比如说,叫做“restaurants”。对于每个餐厅,都有一个名为“visited”的子集合,我们在其中捕获访问过该餐厅的每个用户的 userId。数据库如下所示:

我们选择创建子集合而不是在餐厅内部使用数组,因为我们希望这个数字会增加到非常大的文档大小。此外,我们不确定涉及非常长的数组(其中 1000 个数组中的 100 个)的查询的性能。

无论如何,既然我们有了这些名为“visited”的子集合,我们就可以使用带有索引的集合组查询来执行类似“查找用户访问过的所有餐馆:”abcdxyz“和”==查询,并按照一定的顺序,可以说,按visitedOn 日期/时间排序。

这是我们尝试在 python 中运行的内容:

db.collection_group(u'visited').where(u'userId', u'!=', u'idoftheuser').order_by('visitedOn', direction=firestore.Query.DESCENDING)

当我们运行此程序来查找该用户从未访问过的餐厅时,Firestore 抛出以下错误:

ValueError: 运算符字符串 '!=' 无效。有效的选择是:、>=、array_contains

这是真的吗?为什么他们不允许在单个集合中使用“!=”查询?我们怎样才能绕过这个问题?我们真的不想再对我们的数据库模型进行任何更改。来来回回已经太多了。

有什么建议吗?

【问题讨论】:

  • 请编辑您的问题并添加它的屏幕截图,而不是描述您的数据库的外观。除此之外,还请添加您正在使用的整个“!=”查询。
  • 编辑了问题,Alex。
  • Alex,这里有什么建议吗?

标签: python android firebase google-cloud-firestore denormalization


【解决方案1】:

当涉及到不等于 (!=) 查询时,有一些 limitations

在复合查询中,范围(<<= >>=)和不等于(!=not-in)比较都必须在同一字段上进行过滤。

这就是以下查询的原因:

db.collection_group(u'visited').where(u'userId', u'!=', u'idoftheuser').order_by('visitedOn', direction=firestore.Query.DESCENDING)

不起作用。除此之外,还请注意,包含where()order_by() 调用的查询需要创建index

【讨论】:

  • 好的。但是限制并没有谈论查询不起作用,是吗?我不在乎顺序。那它会起作用吗?是的,我已经创建了一个索引,这就是我的 == 查询的工作方式。如果删除“order_by”后上述方法仍不起作用,是否有替代方法?
  • 事实上,我只是在 Java 中尝试了 '!=' 并且查询至少通过了(由于某种原因它在 Python 中不起作用)。但是,查询结果并不乐观——它没有从集合中返回至少有一个 != 条件成功的文档。很奇怪。
  • 限制本身提供了足够的信息,“比较必须全部过滤同一字段”,否则将不起作用。除此之外,这与顺序无关,每个方法调用都返回一个 Query 对象,因此顺序无关紧要。另一种方法是,不要过滤不同字段上的元素并始终创建索引,或者创建另一个架构,您可以根据需要在其中存储元素,即使涉及到denormalization
  • Alex,我不确定您所说的“不要过滤不同字段上的元素”是什么意思,查询中只使用了一个字段 -> where('userId', '!=' , 'idoftheuser')
  • 这与“比较必须在同一字段上过滤”相反。那是你不会做的事情。
猜你喜欢
  • 1970-01-01
  • 2019-06-20
  • 2020-09-21
  • 2019-10-02
  • 1970-01-01
  • 2019-07-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多