2017-07-06 101 views
1

我有一个数据库,其被构造为的MongoDB +合并字典

{"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 }} 

有没有一种方法来实现这一点,在此先感谢。

+0

你应该改变你的结构'{ “ID”:5, “类型”:[{ “K”: “你好” ,“v”:1},{“k”:“luck”,“v”:1},{“k”:“sad”,“v”:2}]}'带有键值对。然后你可以使用'db.collection.aggregate({“$ unwind”:“$ type”},{$ group:{“_ id”:“$ type.k”,“count”:{“$ sum”:“ $ type.v“}}})' – Veeram

+0

谢谢,先生,可以根据当前数据结构进行搜索吗? –

回答

1

蒙戈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']