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

上のグループの結果、私は取得しています:

をこのデータを与え

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

ここに私の分析です:

マッチングや日付でソートする前に、データがあった。

"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

'aggregate'へのあなたのパイプラインパラメータは配列に入れられるか、大きなオブジェクトではなく独立したオブジェクトとして渡される必要があります。そしてあなたの質問は 'cid'のグループ化について話しますが、コマンドは' $ date'をグループ化しています。 – JohnnyHK

+0

それはタイプミスでした。 $ group:{_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 。日付'。 check 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

関連する問題