I want to select the most recent documents from a collection. The answer from this question mongodb: how to get the last N records? suggests that the order of operations in the query matters. However this does not appear to be the case (perhaps since Mongo 2.4 was released). I've tried both of the following queries and it appears that Mongo first applies the limit and then performs the sort.

Query 1

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

Query 2

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

What would be the correct query to tell mongo to sort first and limit second?

EDIT --- Here's a sample document from the collection

{
  _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"
}
share|improve this question
up vote 35 down vote accepted

The problem is that you need to sort on date instead of $date.

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

Mongo applies the sort before limiting the results regardless of the order you call sort and limit on the cursor.

Proof in docs: link

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.