mongodb 在限制结果之前,您如何告诉 Mongo 对集合进行排序?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/17509025/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How do you tell Mongo to sort a collection before limiting the results?
提问by hughesdan
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.
我想从集合中选择最新的文档。这个问题的答案mongodb:如何获取最后N条记录?表明查询中的操作顺序很重要。然而,情况似乎并非如此(也许自 Mongo 2.4 发布以来)。我已经尝试了以下两个查询,看起来 Mongo 首先应用限制,然后执行排序。
Query 1
查询 1
myCollection.find().sort( { '$date': 1 }).limit(50, callback);
Query 2
查询 2
myCollection.find().limit(50).sort( { '$date': 1 }, callback);
What would be the correct query to tell mongo to sort first and limit second?
告诉 mongo 首先排序并限制其次的正确查询是什么?
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"
}
回答by JohnnyHK
The problem is that you need to sort on date
instead of $date
.
问题是你需要排序date
而不是$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.
Mongo 在限制结果之前应用排序,而不管您调用的顺序sort
和limit
游标上的顺序如何。
Proof in docs: link
文档中的证明:链接
db.bios.find().sort( { name: 1 } ).limit( 5 ) db.bios.find().limit( 5 ).sort( { name: 1 } )
The two statements are equivalent; i.e. the order in which you chain the limit() and the sort() methods is not significant. Both statements return the first five documents, as determined by the ascending sort order on ‘name'.
db.bios.find().sort( { name: 1 } ).limit( 5 ) db.bios.find().limit( 5 ).sort( { name: 1 } )
这两个语句是等价的;即链接 limit() 和 sort() 方法的顺序并不重要。两个语句都返回前五个文档,由“name”的升序排序决定。
回答by maudulus
I had troubled using the limit
, had to remove the $ before it:
我在使用 时遇到了麻烦limit
,不得不在它之前删除 $:
MyCollection.find({ "exampleQuery._id": "exampleId123xx }, { $sort: { requestDate: -1 }, limit: 3 });