假设我使用 where 和 orderBy 和 limit 进行了以下简单查询,这将返回我的公开个人资料(因此位置),该位置最近已更新(因此 orderBy )。
db.collection('profile')
.where('public_profile', '==', true)
.orderBy('updated_at', 'desc')
.limit(1)
.onSnapshot(function(doc) {
...
});
现在,我想添加一些其他逻辑,这意味着我只想显示级别低于某些级别的配置文件。当我执行以下操作时:
db.collection('profile')
.where('public_profile', '==', true)
.orderBy('updated_at', 'desc')
.where('level', '<=', 5)
.limit(1)
.onSnapshot(function(doc) {
...
});
我收到以下错误:
无效的查询。您有一个不等式(小于, 域上的lessThanOrEqual,GreaterThan或GreaterThanOrEqual) 'talent.level',因此您还必须先使用'level' queryOrderedBy字段,但是您的第一个queryOrderedBy当前处于 字段“ updated_at”代替。
据我了解,我需要添加其他 orderBy ,并提供以下信息:
db.collection('profile')
.where('public_profile', '==', true)
.where('level', '<=', 5)
.orderBy('level', 'desc')
.orderBy('updated_at', 'desc')
.limit(1)
.onSnapshot(function(doc) {
...
});
但是,这给我带来了错误的结果:它不会返回级别低于或等于5的最近更新的公共配置文件。它会向我返回配置文件的最新更新的公共配置文件。最高级别。
你们有没有发现类似的问题?如果是,您的解决方案是什么?
答案 0 :(得分:0)
如限制页面(click)中的文档所述,如果您使用范围比较(<,<=,>,> =),则使用的第一个顺序应为相同的字段。< / p>
确定订单后,它可能会提示您创建该集合的广告索引,以使用这些条件。
提示:在Firestore上,where条件应位于顶部,order by应位于底部。 (有助于更好地了解条件顺序)