2011-11-17 6 views
2

J'ai une collection appelée contract et je voudrais group using "a_id"MongoDB: obtenir la liste des valeurs à l'aide du groupe

{ 
a_id: 1, 
"name": "n1" 
} 
{ 
a_id: 2, 
"name": "n2" 
} 
{ 
a_id: 1, 
"name": "n3" 
} 
{ 
a_id: 1, 
"name": "n4" 
} 
{ 
a_id: 2, 
"name": "n5" 
} 

Je veux group by "a_id" me montrer la liste des noms associés.

{ 
a_id: 1, 
values: ["n1", "n3", "n4"] 
} 
{ 
a_id: 2, 
values: ["n2", "n5"] 
} 

Mon code:

db.contract.group({ 
     key:{a_id: 1}, 
     initial: {v: ''}, 
     reduce: function(doc, obj){ 
      v = v + " " + obj.name 
     } 
}); 

Ma sortie:

{ 
     "a_id" : 1, 
     "v" : "" 
    }, 
    { 
     "asset_id" : 2, 
     "v" : "" 
    } 

Cela ne retourne pas la liste des valeurs, mais journaux mongd me montre la liste des noms, comment puis-je corriger cela?

fixe

db.contract.group({ 
    key:{a_id: 1}, 
    initial: {v: []}, 
    reduce: function(obj, prev){ 
     prev.v.push(obj.name) 
    } 
}); 

Répondre

1

fixe

db.contract.group({ 
    key:{a_id: 1}, 
    initial: {v: []}, 
    reduce: function(obj, prev){ 
     prev.v.push(obj.name) 
    } 
}); 
9

Vous pouvez également utiliser MongoDB's aggregation framework:

Ce qui suit fonctionne exactement le même:

db.contract.aggregate({$group: { '_id': '$a_id', 'name': { $push: '$name'}}}) 

qui suit mettra chaque valeur unique une seule fois dans le jeu de résultats (dans le cas où il y a des noms dupliqués par « a_id »):

db.contract.aggregate({$group: { '_id': '$a_id', 'name': { $addToSet: '$name'}}}) 
Questions connexes