Mongodb按键分组

Mongodb按键分组,mongodb,Mongodb,由于查找,我有以下记录集: [{ 'programming': 7 }, { 'programming': 9 }, { 'programming': 6 }, { 'programming': 10 }, { 'music': 1 }, { 'music': 2 }, { 'music': 3 }, { 'music': 4 }] 我想按键对它们进行分组并求和值,以便: [{'programming': 32}, {'music': 10}] 在本例中,按值排序,首先编程,然后音乐,如果

由于查找,我有以下记录集:

[{ 'programming': 7 },
{ 'programming': 9 },
{ 'programming': 6 },
{ 'programming': 10 },
{ 'music': 1 },
{ 'music': 2 },
{ 'music': 3 },
{ 'music': 4 }]
我想按键对它们进行分组并求和值,以便:

[{'programming': 32},
 {'music': 10}]
在本例中,按值排序,首先编程,然后音乐,如果有编程32、音乐10、购物3和生活方式1,则限制为3,仅返回编程、购物和生活方式

如何汇总这些数据?我应该使用mapreduce、aggregate还是简单地使用group?如果是这样,如何通过字典键来区分组与组


谢谢

按键操作会破坏查询的可维护性

我最好的建议是:创建另一个键,比如skill,它将是文档分组键和一个名为value的键。 然后您将得到一个类似以下内容的查询:

db.skills.aggregate([{
  $group: {
    _id: "$skill",
    value: { $sum: "$value" }
  }
}])

按键执行这一操作会破坏查询的可维护性

我最好的建议是:创建另一个键,比如skill,它将是文档分组键和一个名为value的键。 然后您将得到一个类似以下内容的查询:

db.skills.aggregate([{
  $group: {
    _id: "$skill",
    value: { $sum: "$value" }
  }
}])

尽管我建议使用@gustavohenke的路线,而不是按键分组,但您可以使用mapreduce来完成,我想不出一种使用聚合的方法,聚合是更直接的路线

>var mapFunction=函数{ 此{ ifkey!=“id”emitkey,此[键]; } }; >var reduceFunction=functionkey,值{return Array.sumvalues;} >db.data.mapReducemapFunction,reduceFunction,{out:'bop'} { 结果:国际收支平衡表,, 时间毫秒:47, 计数:{ 投入:8, 排放量:8, 减少:2, 产出:2 }, 好:1,, } >db.bop.find.sort{value:-1}.limit3 {u id:programming,value:32} {u id:music,value:10} >
尽管我建议使用@gustavohenke的路线,而不是按键分组,但您可以使用mapreduce来完成,我想不出一种使用聚合的方法,聚合是更直接的路线

>var mapFunction=函数{ 此{ ifkey!=“id”emitkey,此[键]; } }; >var reduceFunction=functionkey,值{return Array.sumvalues;} >db.data.mapReducemapFunction,reduceFunction,{out:'bop'} { 结果:国际收支平衡表,, 时间毫秒:47, 计数:{ 投入:8, 排放量:8, 减少:2, 产出:2 }, 好:1,, } >db.bop.find.sort{value:-1}.limit3 {u id:programming,value:32} {u id:music,value:10} > 希望这会有所帮助

测试日期:v3.6.5

db.cname.aggregate([
{
    $project:
    {
        _id: 0
    }
},
{
    $project:
    {
        "o":
        {
            $objectToArray: "$$ROOT"
        }
    }
},
{
    $unwind: "$o"
},
{
    $group:
    {
        _id: "$o.k",
        value:
        {
            $sum: "$o.v"
        }
    }
}])
输出

{ "_id" : "music", "value" : 10 }

{ "_id" : "programming", "value" : 32 }
希望这会有所帮助

测试日期:v3.6.5

db.cname.aggregate([
{
    $project:
    {
        _id: 0
    }
},
{
    $project:
    {
        "o":
        {
            $objectToArray: "$$ROOT"
        }
    }
},
{
    $unwind: "$o"
},
{
    $group:
    {
        _id: "$o.k",
        value:
        {
            $sum: "$o.v"
        }
    }
}])
输出

{ "_id" : "music", "value" : 10 }

{ "_id" : "programming", "value" : 32 }