【问题标题】:How to retrieve posts of the last 24 hours and then sort them by clicks and then by timestamps?如何检索过去 24 小时的帖子,然后按点击次数排序,然后按时间戳排序?
【发布时间】:2020-02-17 20:17:23
【问题描述】:

如何运行查询,仅检索过去 24 小时的帖子,然后按点击次数排序,然后按时间戳对点击次数相同的帖子进行排序?

参考:

https://firebase.google.com/docs/firestore/query-data/order-limit-data

这是允许文档解释的(不是我想要的结果):

getRef = global.db.collection("AllSubmissions")
               .orderBy('timestamp', 'desc')
               .where("timestamp", ">", date24)
               .orderBy('clicks', 'desc')
               .startAfter(theDoc)
               .limit(limit);

但这是我想要的:

getRef = global.db.collection("AllSubmissions")
               .orderBy('clicks', 'desc')
               .orderBy('timestamp', 'desc')
               .where("timestamp", ">", date24)
               .startAfter(theDoc)
               .limit(limit);

为此我收到以下错误(如文档中所述):

错误:

错误:3 INVALID_ARGUMENT:不等式过滤器属性和第一排序顺序必须相同:时间戳和点击次数

是否有另一种方法来构建我错过的查询,或者这真的是 Firestore 限制吗?

P.S.:我确实为所有复合查询创建了索引。

【问题讨论】:

  • 这能回答你的问题吗? Firestore order by two fields
  • @LouysPatriceBessette 它没有但感谢您的分享(我已经有多个“orderBy”的查询运行良好,这是一个带有 where() 的特定顺序不起作用)
  • @FrankvanPuffelen 看来这可以通过 MongoDB 实现? docs.mongodb.com/manual/indexes 有没有一种简单的方法可以将我的 Firestore 数据导出到 MongoDB,或者我是否必须编写自定义代码来重组数据?或者有什么方法可以实现我想要用我忽略的 Firestore 做的事情?

标签: javascript node.js firebase google-cloud-firestore


【解决方案1】:

对不起我的最后一个答案,我发现我运行了错误的代码。正如你提到的,当你运行代码时

getRef = global.db.collection("AllSubmissions")
           .orderBy('clicks', 'desc')
           .orderBy('timestamp', 'desc')
           .where("timestamp", ">", date24)
           .startAfter(theDoc)
           .limit(limit);

你得到以下错误

错误:3 INVALID_ARGUMENT:不等式过滤器属性和第一排序顺序必须相同:时间戳和点击次数

对于我分享的代码:

getRef = global.db.collection("AllSubmissions")
       .orderBy('clicks', 'desc')
       .orderBy('timestamp', 'desc')
       .where("clicks", ">=", 0)
       .where("timestamp", ">", date24)
       .startAfter(theDoc)
       .limit(limit);

你得到一个新的错误

错误:3 INVALID_ARGUMENT:不能在多个属性上使用不等式过滤器:[点击次数,时间戳]

一般来说,这些错误是查询限制的一部分。第一个错误与this 有关,其中提到了以下内容:

要检索与不等式过滤器匹配的所有结果,查询会扫描索引以查找与过滤器匹配的第一行,然后向前扫描,直到遇到不匹配的行。对于包含完整结果集的连续行,它们必须按不等式过滤器中使用的属性在任何其他属性之前进行排序。因此,如果查询指定了一个或多个不等式过滤器以及一个或多个排序顺序,则第一个排序顺序必须引用不等式过滤器中命名的相同属性。

而第二个错误可能与this 更相关,其中提到了以下内容:

为避免扫描整个索引,查询机制依赖于索引中所有查询的潜在结果彼此相邻。为满足此限制条件,单个查询不得在其所有过滤器中对多个属性使用不等式比较(LESS_THAN、LESS_THAN_OR_EQUAL、GREATER_THAN、GREATER_THAN_OR_EQUAL、NOT_EQUAL)。

您可以检查此document 查询的其他限制。

【讨论】:

    猜你喜欢
    • 2016-01-15
    • 1970-01-01
    • 1970-01-01
    • 2016-02-15
    • 2011-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-02
    相关资源
    最近更新 更多