2017-07-06 81 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']