最近我在玩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

===============>>#1 票数:3

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

为了获得所需的结果,最好将应用程序代码中的游标输出反转掉,特别是如果要限制为较小的结果集(此处使用2)的话。 确切的代码取决于您使用的语言,而您尚未指定。

===============>>#2 票数:3

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

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

是相同的

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

  ask by sleeper translate from so

未解决问题?本站智能推荐:

1回复

MongoDB排序和限制问题

我的问题是我想要返回数据库中最后五个创建条目的文档。 我知道这样的事情: 应该工作,但事实并非如此。
4回复

带有限制和排序的java中的mongodb问题

收藏:progs的 在mongo控制台中: 在Java中: 有人可以解释一下这个区别吗?
1回复

Mongo数据库重复问题,同时使用限制排序和跳过聚合

通过使用skip和limit进行排序来获取记录时遇到重复记录的问题: 收集数据: } 聚合查询1: 输出: 聚合查询2: 结论: 当改变跳过0-> 4时,得到具有名称F,I,A的重复记录 不知道为什么会这样?
1回复

Mongodb / Jongo排序然后限制,vs限制然后排序

这两个是否保证相同: VS 第二个进行全局排序,然后返回前10个。是否保证第一个这样做相同,还是仅返回10个排序的记录? 谢谢
6回复

如何在mongodb中“排序”和“限制”结果?

我正在尝试使用“排序”和“限制”执行查询。 使用mgo,您可以执行Find(nil).Sort(“-when”).Limit(10)但是新的正式mongo驱动程序没有这种方法。 如何使用新驱动程序进行排序和“限制”?
1回复

MongoDB的最大,排序和限制

我正在尝试使用查找(而不是聚合)为学生提供考试中的最高分。 本质上是按学生排序,找到该学生的最高分,然后对结果集进行排序。 数据如下: 我正在寻找看起来像这样的结果(仅返回学生的最高分): 我尝试了许多不同的组合,但无法正常工作。 我知道在SQL中我会怎么做。 这是我当前
3回复

MongoDB分组依据(+排序和限制)

所以我有下面的SQL分组 我如何在MongoDB中复制该组。 我遇到了这份出色的文章-http://kylebanker.com/blog/2009/11/mongodb-count-group/ 这显示了如何在Mongo中使用分组依据,但没有讨论如何在组内实施order by和
2回复

MongoDB聚合具有排序和限制

我有一个收集objects 。 每次用户访问对象的页面时,它将作为单独的记录存储在集合中。 现在我需要获取最后N个访问对象的数组。 它应与众不同 ,因此数组应具有N个唯一记录。 另外,应按createddate排序。 因此,如果用户访问了object_id = 1 ,则objec
1回复

具有排序和限制的mongodb命令

嗨,我正在尝试使用Mongo Java API在下面实现此确切命令 我正在考虑做以下类似的事情,但是我只希望返回一个INT,这可能是错误的/漫长的做法。 任何帮助将是巨大的!
1回复

MongoDB对结果进行限制后排序

有没有办法对从限制返回的文件进行排序? 例: 我想要的是获得10个最后登录的用户,然后按邮件数对它们进行排序。