[英]Chaining time-based sort and limit issue
最近我在玩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 shell懒惰地评估游标,也就是说,您执行的一系列链接操作导致使用基于链接操作的最终状态将一个查询发送到服务器。 因此,当您说“ sort({time: -1}).limit(2).sort({time: 1})
,第二次调用将覆盖第一个调用设置的排序。
为了获得所需的结果,最好将应用程序代码中的游标输出反转掉,特别是如果要限制为较小的结果集(此处使用2)的话。 确切的代码取决于您使用的语言,而您尚未指定。
多次将sort()
应用于同一查询没有意义。 有效排序将从上次sort()
调用中获取。 所以
sort({time: -1}).limit(2).sort({time: 1})
是相同的
sort({time: 1}).limit(2)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.