【问题标题】:Chaining time-based sort and limit issue链接基于时间的排序和限制问题
【发布时间】:2012-01-18 10:46:48
【问题描述】:

最近我在玩 mongo 和 sort/limit 时遇到了一些奇怪的行为(即,恕我直言,它们是违反直觉的)。

假设我确实有以下收藏:

> db.fred.find()
{ "_id" : ObjectId("..."), "record" : 1, "time" : ISODate("2011-12-01T00:00:00Z") }
{ "_id" : ObjectId("..."), "record" : 2, "time" : ISODate("2011-12-02T00:00:00Z") }
{ "_id" : ObjectId("..."), "record" : 3, "time" : ISODate("2011-12-03T00:00:00Z") }
{ "_id" : ObjectId("..."), "record" : 4, "time" : ISODate("2011-12-04T00:00:00Z") }
{ "_id" : ObjectId("..."), "record" : 5, "time" : ISODate("2011-12-05T00:00:00Z") }

我想要按时间顺序检索“记录”之前的 2 条记录:4 加记录 4(即记录 2、记录 3 和记录 4)

天真地,我是在做一些事情:

db.fred.find({time: {$lte: ISODate("2011-12-04T00:00:00Z")}}).sort({time: -1}).limit(2).sort({time: 1})

但它并没有按我预期的方式工作:

{ "_id" : ObjectId("..."), "record" : 1, "time" : ISODate("2011-12-01T00:00:00Z") }
{ "_id" : ObjectId("..."), "record" : 2, "time" : ISODate("2011-12-02T00:00:00Z") }

我在想结果应该是记录 2、记录 3 和记录 4。

据我回忆,似乎 2 排序在限制之前确实适用:

  sort({time: -1})                          => record 4, record 3, record 2, record 1
  sort({time: -1}).limit(2)                 => record 4, record 3
  sort({time: -1}).limit(2).sort({time: 1}) => record 1, record 2

也就是说,就像第二次排序被应用于 find 返回的游标(即整个集合),然后才应用限制。

我的错误是什么?如何实现预期的行为?

顺便说一句:在 Ubuntu 11.01 上运行 mongo 2.0.1

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    MongoDB shell 懒惰地评估游标,也就是说,您执行的一系列链式操作会导致将一个查询发送到服务器,使用基于链式操作的最终状态。因此,当您说“sort({time: -1}).limit(2).sort({time: 1})”时,第二次调用 sort 会覆盖第一次调用设置的排序。

    为了达到您想要的结果,您最好在应用程序代码中反转光标输出,特别是如果您限制为一个小结果集(这里您使用的是 2)。执行此操作的确切代码取决于您使用的语言,但您尚未指定。

    【讨论】:

    • 好的,明白我的错误了 :) 谢谢你的解释!
    【解决方案2】:

    sort() 多次应用于同一个查询在这里没有意义。有效排序将从最后一次sort() 调用中获取。所以

    sort({time: -1}).limit(2).sort({time: 1})
    

    相同
    sort({time: 1}).limit(2)
    

    【讨论】:

    • OK ...我不明白虽然该操作是可链接的,但它们并不是真正可组合的。另一方面,查看stackoverflow.com/a/6751102/745918,似乎这是您要检索最后X条消息时的推荐构造。
    • @sleeper 该特定答案具有误导性。切勿将这里的任何内容视为 100% 真实,尤其是来自声誉低下的用户。
    猜你喜欢
    • 2022-11-03
    • 2021-09-08
    • 2022-08-04
    • 1970-01-01
    • 1970-01-01
    • 2018-10-05
    • 2021-11-11
    • 2015-01-11
    • 1970-01-01
    相关资源
    最近更新 更多