【问题标题】:Sum different fields using aggregation in MongoDB在 MongoDB 中使用聚合对不同字段求和
【发布时间】:2017-04-26 20:51:57
【问题描述】:

我在 test 集合中有一个文档架构,如下所示:

{
  "_id" : NumberLong("A unique number"),
  "text" : {
         "characters_map" : {
                          "a" : 4,
                          "f" : 3,
                          "b" : 6,
                            ...
                          "o" : 3
                         }
            ...
         }
    ...
}

我想计算整个集合中每个字符的总和。我尝试使用aggregation framework,但似乎我做得不对。

我开始分别计算每个字符(即“a”),但没有运气。我最好的方法是:

> db.test.aggregate([
    { "$group" : {
         _id : { a_count : "$text.characters_map.a" },
         counter : { "$sum" : "$text.characters_map.a" }
      }
    }
  ])

a_count代表id的名字。

结果:

{ "_id" : { "a_map" : 8 }, "counter" : 8 }
{ "_id" : { "a_map" : 5 }, "counter" : 5 }
{ "_id" : { "a_map" : 7 }, "counter" : 21 }
 ...

不完全是假的,但不是我想要的。这些结果意味着我有 1 个文档的字段为:{ "a" : 8, ... },另外 1 个文档的字段为:{ "a" : 5, ... },3 个文档的字段为:{ "a" : 7, ... }

有没有办法在“a”级别将这些字段组合在一起?我的方法完全错误吗?

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:

    您必须将结构更改为如下所示。(首选)

    [{
      "text" : { "characters_map" : [{"k":"a", "v":4},  {"k":"b", "v":8},  {"k":"c", "v":5}, {"k":"d", "v":4  }]  }
    }]
    

    您可以按照您在帖子中尝试的方式使用聚合。

    db.test.aggregate([
     {$unwind:"$text.characters_map"},
     {$group:{_id:"$text.characters_map.k", counter:{$sum:"$text.characters_map.v"}}}
     ])
    

    如果你不能改变你的结构,这就是解决方案。

    您可以使用3.4.4版本和$objectToArray & $arrayToObject在动态键和标签值对之间切换。

    第 1 阶段:将动态 characters_map 键转换为标签值对。

    第 2 和第 3 阶段:$unwind$group 对字符进行计数并求和。

    第 4 阶段和第 5 阶段:将最后一次分组的输出组合成键值对数组,后跟 $arrayToObject,将键值对转换为动态键。

    db.test.aggregate([
     {$addFields: {"text.characters_map": {$objectToArray: "$text.characters_map"}}},
     {$unwind:"$text.characters_map"},
     {$group:{_id:"$text.characters_map.k", counter:{$sum:"$text.characters_map.v"}}},
     {$group:{_id:null, arraykeyval:{$push:{k:"$_id", v:"$counter"}}}},
     {$project:{result: {$arrayToObject:"$arraykeyval"}}}
     ])
    

    【讨论】:

    • 就像一个魅力!也非常感谢架构重组的推荐,我没想到!现在说得通了……
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    • 2013-09-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-16
    相关资源
    最近更新 更多