你如何告诉 Mongo 在限制结果之前对集合进行排序?

Posted

技术标签:

【中文标题】你如何告诉 Mongo 在限制结果之前对集合进行排序?【英文标题】:How do you tell Mongo to sort a collection before limiting the results? 【发布时间】:2013-07-04 17:53:55 【问题描述】:

我想从集合中选择最新的文档。这个问题mongodb: how to get the last N records? 的答案表明查询中的操作顺序很重要。然而,情况似乎并非如此(也许自 Mongo 2.4 发布以来)。我已经尝试了以下两个查询,似乎 Mongo 首先应用了限制,然后执行了排序。

查询 1

myCollection.find().sort(  '$date': 1 ).limit(50, callback);

查询 2

myCollection.find().limit(50).sort(  '$date': 1 , callback);

告诉 mongo 先排序并限制第二个的正确查询是什么?

编辑 --- 这是集合中的示例文档


  _id: ObjectId("517eb0dddbab79c74700005d"),
  audioFiles: [
    
      audioFileName: "C64FEFA8-DD43-40A1-8996-35948F3438BF-6896-0000027BD4A59D91",
      audioLanguage: "English",
      date: ISODate("2013-05-21T16:23:04.006Z"),
      flag: "1",
      user: "36C4DEB6-C13D-4211-94B5-CC4DD993ECF1-6896-00000278FA7B08EC"
    ,
    
      audioFileName: "994B6DF6-73B5-458F-912A-FF67A84534B2-23532-0000020000000000",
      audioLanguage: "English",
      date: ISODate("2013-05-27T10:45:04.107Z"),
      flag: "1",
      user: "9D7BB3F4-371B-4F2A-8DA2-0C4CE8B4E16D-974-0000000000000000"
    
  ],
  date: ISODate("2013-04-29T17:41:49.101Z"),
  imageFileName: "SteamLokomotive0498",
  random: 0.6750695831142366,
  thumbFileName: "SteamLokomotive0498_150x150",
  user: "62923D8E-00CE-4F0C-AECA-3010D78FC9CE-226-0000000000000000",
  userLanguagePref: "Cantonese"

【问题讨论】:

【参考方案1】:

问题是您需要对date 而非$date 进行排序。

myCollection.find().sort(date: 1).limit(50, callback);

Mongo 在限制结果之前应用排序,无论您在光标上调用sortlimit 的顺序如何。

文档中的证明:link

db.bios.find().sort(  name: 1  ).limit( 5 )
db.bios.find().limit( 5 ).sort(  name: 1  )

这两个语句是等价的;即您链接的顺序 limit() 和 sort() 方法并不重要。两种说法 返回前五个文档,由升序确定 按“名称”排序。

【讨论】:

链接只是说这两个语句是等价的,而不是在限制之前调用排序。还有更明显的证据吗? 我将文档中的信息添加到了答案中。见第二句。 这是进行完整排序还是进行优化并仅应用部分排序? 另一个控制何时执行排序的选项可能是使用聚合框架:docs.mongodb.com/manual/reference/operator/aggregation/sort【参考方案2】:

我在使用 limit 时遇到了麻烦,必须删除它之前的 $:

MyCollection.find( "exampleQuery._id": "exampleId123xx ,  $sort:  requestDate: -1 , limit: 3 );

【讨论】:

以上是关于你如何告诉 Mongo 在限制结果之前对集合进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

如何对 cloudkit 中给出的结果数量设置限制

Mongo:使用 $in 数组参数对结果进行排序 [重复]

Mongo:使用 $in 数组参数对结果进行排序 [重复]

如何利用php数组对百万数据进行排重

CCCC L2-010. 排座位并查集/分类讨论

在 Mongo 中,如何显示集合的索引? [复制]