2013-01-25 68 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