问题描述
我们有一个集合,比如说,叫做“餐厅”。对于每家餐厅,都有一个名为“visited”的子集合,我们在其中捕获访问过该餐厅的每个用户的 userId。下面是数据库的样子:
我们选择在餐馆内部使用数组创建子集合,因为我们预计这个数字会增加到非常大的文档大小。此外,我们不确定涉及非常长的数组(其中 100 个中 1000 个)的查询的性能。
无论如何,既然我们有了这些名为“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
这是真的吗?当它们在单个集合中被允许时,为什么它们不允许“!=”查询?我们怎样才能解决这个问题?我们真的不想再对我们的数据库模型进行任何更改。已经来回太多了。
有什么建议吗?
解决方法
当涉及到不相等 (!=) 查询时,有一些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。