2013-01-25 47 views
11

我想按日期排序数据,然后在另一个字段组。 它不适合我。Mongo聚合框架,排序,然后组不工作

我想回答的问题是:选择最近的独特cid?

给出这样的数据:

db.summary.save({"lid" : 5, "date" : 5, "cid" : 2, "circles" : [ 2 ] }) 
db.summary.save({"lid" : 2, "date" : 2, "cid" : 1, "circles" : [ 2 ] }) 
db.summary.save({"lid" : 4, "date" : 0, "cid" : 3, "circles" : [ 2 ] }) 
db.summary.save({"lid" : 3, "date" : 3, "cid" : 2, "circles" : [ 2 ] }) 
db.summary.save({"lid" : 1, "date" : 1, "cid" : 1, "circles" : [ 2 ] }) 

db.summary.aggregate({$match :{circles: 2}, $sort: {date: -1}, $group: {_id: '$cid'}}) 

我在圈子首先进行比赛, 然后排序上的日期, 然后在CID

我得到的结果是一组:

我的分析:

匹配或按日期排序之前,该数据是:

"lid" : 5, "date" : 5, "cid" : 2 
"lid" : 2, "date" : 2, "cid" : 1 
"lid" : 4, "date" : 0, "cid" : 3 
"lid" : 3, "date" : 3, "cid" : 2 
"lid" : 1, "date" : 1, "cid" : 1 

按日期排序后,该数据集将是:

"lid" : 5, "date" : 5, "cid" : 2 
"lid" : 3, "date" : 3, "cid" : 2 
"lid" : 2, "date" : 2, "cid" : 1 
"lid" : 1, "date" : 1, "cid" : 1 
"lid" : 4, "date" : 0, "cid" : 3 

所以分组后,我希望结果是:

{ 
    "result" : [ 
     { 
      "_id" : 2 
     }, 
     { 
      "_id" : 1 
     }, 
     { 
      "_id" : 3 
     } 
    ], 
    "ok" : 1 
} 

什么查询能解决我的问题?

为什么当前查询不适合我?

+0

您的管道参数“聚合”需要放在数组中或作为独立的对象而不是一个大对象传递。你的问题是关于'cid'上的分组,但是命令是在'$ date'上分组的。 – JohnnyHK

+0

这是一个错字。它应该是$组:{_id:'$ cid'} – ben39

回答

17

当您在管道中$sort之后$group时,以前的排序会丢失。你不得不做这样的事情,而不是让你想排序日期分组后可用:

db.summary.aggregate(
    {$match: {circles: 2}}, 
    {$group: {_id: '$cid', date: {$max: '$date'}}}, 
    {$sort: {date: -1}}); 

结果:

[ { _id: 2, date: 5 }, 
    { _id: 1, date: 2 }, 
    { _id: 3, date: 0 } ] 

添加$project到流水线的末端如果你想重塑输出。

+0

谢谢!这正是我正在寻找的东西,即使我已经在你回答时已经找到了它:) – ben39

+1

不要忘记,如果你想对$组中的任何东西进行排序,你必须将它包含在$ sort中,用'_id 。日期'。 检查http://stackoverflow.com/questions/21265170/mongodb-aggregation-sort-not-working – mwm

+2

“当$ group在管道中排序后,以前的排序会丢失。”这不是真的(可能过时)。这不仅是可能的,但它是首选的方式,因为这种方式可以使用索引:https://docs.mongodb.com/manual/reference/operator/aggregation/sort/#sort-operator-and-performance – slouc