Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB+;合并词典_Mongodb_Aggregation Framework - Fatal编程技术网

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”}}}}})
谢谢,先生,可以根据当前的数据结构进行搜索吗?