20

最初に日付でデータを並べ替えてから、別のフィールドでグループ化しようとしています。それは私にはうまくいきません。

私が答えようとしている質問は次のとおりです。最新の個別の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
}

問題を解決するクエリは何ですか?

現在のクエリが機能しないのはなぜですか?

4

1 に答える 1

34

パイプラインを$group後にすると、前の並べ替えは失われます。$sortグループ化後に並べ替えたい日付を利用できるようにするには、代わりに次のようにする必要があります。

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 } ]

出力を再形成する場合は、パイプラインの最後に a を追加し$projectます。

于 2013-01-25T02:50:42.000 に答える