MongoDB+;合并词典
我有一个数据库,它的结构如下MongoDB+;合并词典,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我有一个数据库,它的结构如下 {"id":5, "type":{"hello":1,"sad":2,"luck":1}}) 现在我做搜索 db.collection.distinct("type") [ { "hello" : 1, "sad" : 2 }, { "hello" : 1, "sad" : 2, "luck" : 1 } ] 现在我想将每个键的所有值相加,得到如下结果:
{"id":5,
"type":{"hello":1,"sad":2,"luck":1}})
现在我做搜索
db.collection.distinct("type")
[
{
"hello" : 1,
"sad" : 2
},
{
"hello" : 1,
"sad" : 2,
"luck" : 1
}
]
现在我想将每个键的所有值相加,得到如下结果:
{ "hello" : 2, "sad" : 4, "luck" : 1 }}
是否有一种方法可以实现这一点,请提前感谢。Mongo 3.4.4版本
您可以使用$objectToArray
创建键值对数组
db.collection.aggregate({
"$project": {
"type": {
"$objectToArray": "$type"
}
}
}, {
"$unwind": "$type"
}, {
"$group": {
"_id": "$type.k",
"count": {
"$sum": "$type.v"
}
}
})
旧版本
您可以使用mapreduce
var map = function() {
var type = this.type;
Object.keys(type).forEach( function(key) { emit( key, type[key] ); } );
};
var reduce = function( key, values ) {
return values.length;
};
db.collection.mapReduce( map, reduce, { out: { "inline" : 1} } )['results']
您应该使用键值对将结构更改为
{“id”:5,“type”:[{“k”:“hello”,“v”:1},{“k”:“luck”,“v”:1},{“k”:“sad”,“v”:2}]}
。然后您可以使用db.collection.aggregate({“$unwind”:“$type”},{$group:{“\u id”:“$type.k”,“count”:“{“$sum”:“$type.v”}}}}})
谢谢,先生,可以根据当前的数据结构进行搜索吗?