如何使用mongodb对$ group聚合输出进行排序

时间:2014-07-03 20:59:24

标签: mongodb sorting aggregation-framework

我正在查找按发件人ID分类的文档(电子邮件)的集合,然后返回最常发送的发件人ID,限制为5.我很近但很挣扎现在我需要对组进行排序。据我所知,使用mongodb $group运算符不对输出进行排序,如何将输出分组后立即对输出进行排序。我已经尝试在查询序列的末尾添加.sort(),并将输出设置为等于变量并在其上调用.sort().limit()无效。

我有如下

cursor = db.emailcol.aggregate( 

    [{ $group : {_id : {emails_sent: "$sender_id"}, number : { $sum : 1} }},
        {$sort : {"_id.sender_id": 1}}

    ]
);

while ( cursor.hasNext() ) {
    printjson( cursor.next() );
};

返回:

{ "_id" : { "emails_sent" : "6" }, "number" : 3 }
{ "_id" : { "emails_sent" : "5" }, "number" : 2 }
{ "_id" : { "emails_sent" : "3" }, "number" : 1 }
{ "_id" : { "emails_sent" : "4" }, "number" : 2 }
{ "_id" : { "emails_sent" : "2" }, "number" : 1 }

如何在分组输出上运行排序方法,或者只是为查询添加排序和限制?

1 个答案:

答案 0 :(得分:2)

汇总管道的排序阶段应为:

{$sort : {"_id.emails_sent": 1}}

而不是:

{$sort : {"_id.sender_id": 1}}

因为$ group阶段的输出没有包含字段sender_id的子文档。要调试这些问题,将有助于查看管道的每个阶段的输出。