【发布时间】: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