【问题标题】:Order by with where inequality with limit on Firestore按与 Firestore 限制的不等式排序
【发布时间】:2019-10-03 17:24:48
【问题描述】:

假设我通过 whereorderBylimit 得到以下简单查询,这将返回我的公开资料(因此 where),这是最近更新的(因此 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) {
        ...
   });

我得到以下错误:

查询无效。你有一个不等式的 where 过滤器(小于, 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。它返回我最近更新的公共配置文件,该配置文件具有最高级别。

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

【问题讨论】:

    标签: javascript firebase google-cloud-firestore


    【解决方案1】:

    正如限制页面 (click) 中的文档所述,如果您使用范围比较(、>=),那么您使用的第一个顺序应该是相同的过滤字段。

    修复顺序后,它可能会提示您创建该集合的广告​​索引以使用这些条件。

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

    【讨论】:

    • 你救了我的命,我苦苦挣扎了 1 周,想知道如何在本周创建文档并按其他字段排序,天哪,谢谢
    猜你喜欢
    • 2018-08-19
    • 1970-01-01
    • 2019-04-07
    • 1970-01-01
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    • 2018-10-05
    • 1970-01-01
    相关资源
    最近更新 更多