14

MongoDB 集計フレームワークを使用しているときに配列フィールドをマージすることは可能ですか? ここに私が解決しようとしている要約の問題があります:

集計用の入力ドキュメントの例:

{
  "Category" : 1,
  "Messages" : ["Msg1", "Msg2"],
  "Value" : 1
},
{
  "Category" : 1,
  "Messages" : [],
  "Value" : 10
},
{
  "Category" : 1,
  "Messages" : ["Msg1", "Msg3"],
  "Value" : 100
},
{
  "Category" : 2,
  "Messages" : ["Msg4"],
  "Value" : 1000
},
{
  "Category" : 2,
  "Messages" : ["Msg5"],
  "Value" : 10000
},
{
  "Category" : 3,
  "Messages" : [],
  "Value" : 100000
}

「値」を合計し、「メッセージ」をマージしながら、「カテゴリ」でグループ化します。この集約パイプラインを試しました:

{group : {
        _id : "$Category",
        Value : { $sum : "$Value"},
        Messages : {$push : "$Messages"}
    }
}, 
{$unwind : "$Messages"}, 
{$unwind : "$Messages"}, 
{$group : {
        _id : "$_id",
        Value : {$first : "$Value"},
        Messages : {$addToSet : "$Messages"}
    }
}

結果は次のとおりです。

"result" : [{
        "_id" : 1,
        "Value" : 111,
        "Messages" : ["Msg3", "Msg2", "Msg1"]
    }, 
    {
        "_id" : 2,
        "Value" : 11000,
        "Messages" : ["Msg5", "Msg4"]
    }
]

ただし、「カテゴリ」が 3 であるドキュメントには「メッセージ」がなく、2 回目の巻き戻しによってドロップされるため、これはカテゴリ 3 を完全に見逃しています。結果には以下も含めたいと考えています。

{
    "_id" : 3,
    "Value" : 100000,
    "Messages" : []
}

集約フレームワークによってこれを達成するためのきちんとした方法はありますか?

4

2 に答える 2