配列内のオブジェクト内のフィールドに基づいてすべての値を合計するMongodbAggregateクエリ

Dec 11 2020

私はdataMongoDBに次のようなコレクションを持っています-

ドキュメント1-

{
    metadata:[
        {
            "title": "High",
            "val": 12
        },
        {
            "title": "Medium",
            "val": 15
        },
        {
            "title": "Low",
            "val": 2
        }
    ]
}

document2-

{
    metadata:[
        {
            "title": "High",
            "val": 10
        },
        {
            "title": "Medium",
            "val": 12
        },
        {
            "title": "Low",
            "val": 20
        }
    ]
}

&など..

値にval基づいてフィールドを集計したいと思いtitleます。出力は次のようになります-

{
    "High": 22,
    "Medium": 27,
    "Low": 22
}

どうすればこれを達成できますか?前もって感謝します。

回答

2 turivishal Dec 11 2020 at 12:51
  • $unwind解体のmetadata配列
  • $grpupによってtitle、合計を作るval
  • $groupnullで、配列をキーと値からオブジェクトに変換し$arrayToObject、を使用してオブジェクトをマージします$mergeObjects
db.collection.aggregate([
  { $unwind: "$metadata" }, { $group: {
      _id: "$metadata.title", sum: { $sum: "$metadata.val" } } }, { $group: {
      _id: null,
      metadata: {
        $mergeObjects: { $arrayToObject: [
            [{ k: "$_id", v: "$sum" }]
          ]
        }
      }
    }
  }
])

遊び場

1 ray Dec 11 2020 at 12:31

最初にmetadata配列を$ unwindできます。次に、$ groupを使用して$cond to $値を合計します。

参考までに、モンゴの遊び場をご紹介します。