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 }