48

コレクションから最新のドキュメントを選択したい。この質問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);

最初に並べ替えて 2 番目に制限するように 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"
}
4

2 に答える 2

78

date問題は、の代わりにソートする必要があることです$date

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

Mongo は、呼び出し順sortlimitカーソル位置に関係なく、結果を制限する前に並べ替えを適用します。

ドキュメントでの証明:リンク

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

2 つのステートメントは同等です。つまり、 limit() メソッドと sort() メソッドをチェーンする順序は重要ではありません。どちらのステートメントも、'name' の昇順の並べ替えに従って、最初の 5 つのドキュメントを返します。

于 2013-07-07T03:55:58.060 に答える
0

の使用に問題がありlimit、その前に $ を削除する必要がありました。

MyCollection.find({ "exampleQuery._id": "exampleId123xx }, { $sort: { requestDate: -1 }, limit: 3 });
于 2020-04-22T20:33:47.263 に答える