MongoDB在limit之后对结果进行排序

3
有没有一种方法可以对从limit返回的文档进行排序? 例如:
//returns 10 documents:
db.users.find()
.sort({last_online_timestamp:-1})
.limit(10) 

//returns 10 another documents
db.users.find()
.sort({last_online_timestamp:-1})
.limit(10)
.sort({messages_count:1}); 

我希望您能够获取最近登录的10个用户,并按消息数量对其进行排序。

db.user.find().sort({last_online_timestamp:-1}).limit(10).pretty(); - RïshïKêsh Kümar
db.user.find().sort({last_online_timestamp: -1}).limit(10, callback); - RïshïKêsh Kümar
尝试这个…… - RïshïKêsh Kümar
@RïshïKêshKümar 如果你正在提出一个解决方案,你应该将它发布为完整的答案,而不是评论。 - Vince Bowdren
@Alexander Tyuryaev:在find()查询中不能两次使用sort(),这个问题以前已经有人提过了,例如http://stackoverflow.com/a/43250870/174843或https://dev59.com/XG3Xa4cB1Zd3GeqPem42#14425636或http://stackoverflow.com/q/8474353/174843。相反,你需要使用聚合(aggregation),正如Jeff J.所建议的那样。 - Vince Bowdren
1个回答

7

您可以使用聚合函数,例如

db.users.aggregate([
    {"$sort": {"last_online_timestamp":1}},
    {"$limit": 10},
    {"$sort": {"messages_count": 1}}
])

这将经历几个阶段,其中集合中的文档将会:
  1. last_online_timestamp字段升序排序
  2. 限制为10个文档
  3. 这10个文档将按messages_count字段升序排序
根据实际的last_online_timestamp值,您可能需要将 {"$sort": {"last_online_timestamp":1} 更改为 {"$sort": {"last_online_timestamp":-1}
有关Mongo聚合的更多信息,请参见https://docs.mongodb.com/manual/aggregation/

3
根据文档,无论你以什么顺序编写代码,sort 始终应用于 limit 之前,我认为 db.users.find().sort({last_online_timestamp:-1}).limit(10).sort({messages_count:1}) 不会起作用。 - chimp
@demolisher 你说得对 - 语法是正确的,但结果并不是预期的。我已经更新了答案,只包括聚合部分。谢谢! - Jeff J
"aggregate" 的语法很难读懂,这个更好一些:db.users.aggregate().sort({"last_online_timestamp":1}).limit(10).sort({"messages_count": 1}); - neoexpert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接