用不等式对Firestore进行限制

时间:2019-05-16 12:21:51

标签: javascript firebase google-cloud-firestore

假设我使用 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的最近更新的公共配置文件。它会向我返回配置文件的最新更新的公共配置文件。最高级别。

你们有没有发现类似的问题?如果是,您的解决方案是什么?

1 个答案:

答案 0 :(得分:0)

如限制页面(click)中的文档所述,如果您使用范围比较(<,<=,>,> =),则使用的第一个顺序应为相同的字段。< / p>

确定订单后,它可能会提示您创建该集合的广告​​索引,以使用这些条件。

提示:在Firestore上,where条件应位于顶部,order by应位于底部。 (有助于更好地了解条件顺序)