mongodb聚合排序

Pau*_*ton 31 mongodb

我有一个学生数据库及其联系方式.我正在试图找出容纳最多学生的邮政编码.学生的文件看起来像这样......

{studentcode:'smi0001',名字:'bob',姓:'smith',邮政编码:2001}

我以为我可以使用聚合框架通过做类似的事情找出最多学生的邮政编码...

db.students.aggregate({$project: { postcode: 1 }, $group: {_id: '$postcode', students: {$sum: 1}}})
Run Code Online (Sandbox Code Playgroud)

这按预期工作(将邮政编码_id和每个邮政编码中的学生数量作为"学生"返回,但如果我添加$sort到管道,它似乎尝试按整个学生集合排序,而不是$group操作的结果.

我正在尝试的样子......

db.students.aggregate({$project: { postcode: 1 }, $group: {_id: '$postcode', students: {$sum: 1}}, $sort: {_id: -1}})
Run Code Online (Sandbox Code Playgroud)

但它返回整个集合,并无视$project$group...我缺少的东西?我以为我只能通过减少学生数来排序并返回第一项.在此先感谢您的帮助.

Eve*_*man 58

你几乎拥有它......

db.test.aggregate(
  {$group: {_id: '$postcode', students: {$sum: 1}}}, 
  {$sort: {_id: -1}}
);
Run Code Online (Sandbox Code Playgroud)

给出(我添加了一些与您的样本匹配的测试数据):

{
  "result" : [
    {
        "_id" : 2003,
        "students" : 3
    },
    {
        "_id" : 2002,
        "students" : 1
    },
    {
        "_id" : 2001,
        "students" : 2
    }
  ],
  "ok" : 1
}
Run Code Online (Sandbox Code Playgroud)

你有一个外围的{}东西,这引起了一些混乱.组和排序不是作为管道中的单独操作.

你并不真的需要这个案例的项目.

更新您可能希望按"学生"排序,以便首先获得最大的邮政编码(按人口):

db.test.aggregate(
  {$group: {_id: '$postcode', students: {$sum: 1}}}, 
  {$sort: {students: -1}}
);
Run Code Online (Sandbox Code Playgroud)


Tho*_*mas 5

我认为你的语法有点错误。管道中的每个聚合操作都应该是它自己的文档。

db.students.aggregate( {$project: ...}, {$group: ...}, {$sort: ...} )
Run Code Online (Sandbox Code Playgroud)

在你的情况下,它应该是:

db.students.aggregate(
    {$project: { postcode: 1 }}, 
    {$group: {_id: '$postcode', students: {$sum: 1}}}, 
    {$sort: {students: -1}}
)
Run Code Online (Sandbox Code Playgroud)

我已经根据您的架构在示例集合上测试了它,它对我有用,按学生数量对分组的邮政编码进行降序排序。