首页 文章

Mongodb groupby on Dictionary里面的字典

提问于
浏览
1

我有一个集合,其中包含以下文档:文档1:

{
 "company": "ABC"
 "application": {
    "app-1": {"earning_from_src_A": 50,
              "earning_from_src_B": 43},
    "app-2": {"earning_from_src_A": 10,
              "earning_from_src_B": 13}
 }
}

文件2:

{
 "company": "ABCD"
 "application": {
    "app-1": {"earning_from_src_A": 150,
              "earning_from_src_B": 413},
    "app-2": {"earning_from_src_A": 110,
              "earning_from_src_B": 113},
    "app-3": {"earning_from_src_A": 1,
              "earning_from_src_B": 34},
 }
}

我想在整个收集文件中获得应用程序的总和 . 喜欢:结果:

{
 "app-1": {"earning_from_src_A": 200,
           "earning_from_src_B": 456},
 "app-2": {"earning_from_src_A": 120,
           "earning_from_src_B": 126},
 "app-3": {"earning_from_src_A": 1,
           "earning_from_src_B": 34},
}

有人请帮帮我 .

我尝试使用聚合函数,但我无法在整个集合中进行分组 .

1 回答

  • 2

    您可以使用以下聚合

    所以基本上你的钥匙在这里是未知的因此,您必须使用$objectToArray聚合将它们转换为键值对 . 然后你可以轻松$group使用应用程序名称并从 AB 获得收入 .

    db.collection.aggregate([
      { "$addFields": {
        "application": { "$objectToArray": "$application" }
      }},
      { "$unwind": "$application" },
      { "$group": {
        "_id": "$application.k",
        "earning_from_src_A": {
          "$sum": "$application.v.earning_from_src_A"
        },
        "earning_from_src_B": {
          "$sum": "$application.v.earning_from_src_B"
        }
      }},
      { "$group": {
        "_id": null,
        "data": {
          "$push": {
            "k": "$_id",
            "v": {
              "earning_from_src_A": "$earning_from_src_A",
              "earning_from_src_B": "$earning_from_src_B"
            }
          }
        }
      }},
      { "$replaceRoot": { "newRoot": { "$arrayToObject": "$data" }}}
    ])
    

    哪个outputs

    [
      {
        "app-1": {
          "earning_from_src_A": 200,
          "earning_from_src_B": 456
        },
        "app-2": {
          "earning_from_src_A": 120,
          "earning_from_src_B": 126
        },
        "app-3": {
          "earning_from_src_A": 1,
          "earning_from_src_B": 34
        }
      }
    ]
    

相关问题