2017-07-06 7 views
1

J'ai une base de données, qui est construit commeMongoDB + fusion dictionnaires

{"id":5, 

"type":{"hello":1,"sad":2,"luck":1}}) 

Maintenant, je fais la recherche

db.collection.distinct("type") 
[ 
    { 
     "hello" : 1, 
     "sad" : 2 
}, 
    { 
     "hello" : 1, 
     "sad" : 2, 
     "luck" : 1 
    } 
] 

Maintenant, je veux résumer toutes les valeurs pour chaque touche à un tel résultat :

{ "hello" : 2, "sad" : 4, "luck" : 1 }} 

Existe-t-il une méthode pour y parvenir, merci d'avance.

+0

Vous devez changer votre structure '{ "id": 5, "type": [{ "k": "bonjour" , "v": 1}, {"k": "chance", "v": 1}, {"k": "triste", "v": 2}]} 'avec paire de valeurs clés. Vous pouvez alors utiliser 'db.collection.aggregate ({" $ unwind ":" $ type "}, {$ groupe: {" _ id ":" $ type.k "," count ": {" $ sum ":" $ type.v "}}})' – Veeram

+0

Merci, monsieur, est-il possible de faire la recherche basée sur la structure de données actuelle? –

Répondre

1

Mongo 3.4.4 Version

Vous pouvez utiliser $objectToArray qui crée un tableau de paires de valeurs clés.

db.collection.aggregate({ 
    "$project": { 
     "type": { 
      "$objectToArray": "$type" 
     } 
    } 
}, { 
    "$unwind": "$type" 
}, { 
    "$group": { 
     "_id": "$type.k", 
     "count": { 
      "$sum": "$type.v" 
     } 
    } 
}) 

anciennes versions

Vous pouvez utiliser 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']