2013-10-16 4 views
1

je la structure de tableau suivant:Regroupement tous les autres champs avec MongoDB

Location:

{ 
    '_id' : '1', 
    'user_id' : 1, 
    'item_id' : 6, 
    'name' : "First rental", 
} 
{ 
    '_id' : '2', 
    'user_id' : 2, 
    'item_id' : 7, 
    'name' : "Second rental", 
} 
{ 
    '_id' : '3', 
    'user_id' : 2, 
    'item_id' : 8, 
    'name' : "Third rental", 
} 

Je voudrais une liste de locations groupées par les utilisateurs comme ceci:

{ 
    'user' : '1', 
    'rental_count': 1, 
    'rentals' : [ 
     { 
      '_id' : '1', 
      'item_id' : 6, 
      'name' : "First rental" 
     } 
    ] 
    'user' : '2', 
    'rental_count: 2', 
    'rentals' : [ 
     { 
      '_id' : '2', 
      'item_id' : 7, 
      'name' : "Second rental" 
     }, 
     { 
      '_id' : '3', 
      'item_id' : 8, 
      'name' : "Third rental" 
     }, 
    ] 
} 

Comment pouvez-vous le faire avec mongodb (je peux utiliser le cadre d'agrégation si nécessaire).

J'ai essayé quelque chose comme ceci:

self.collection.aggregate([ 
    {'$group' => {_id: {user_id: '$user_id'}, 
     rental_items: {'$addToSet' => '$item_id'} 
     rental_ids: {'$addToSet' => '$_id'} 
    } 
]}, 

Mais ça ne marchera jamais, parce que j'ai les informations de location dans beaucoup de jeux différents, et je veux toutes les locations dans un tableau unique pour chaque utilisateur.

+0

Peut-être que MapReduce pourrait vous aider ici. – Philipp

Répondre

1

Cette requête globale que vous avez affichée semble à peu près juste, que vous auriez à passer un objet à $addToSet:

db.rentals.aggregate({ "$group" : 
     { _id: "$user_id", 
     rental_count : {$sum : 1}, 
     rentals : {'$addToSet' : 
      { "item_id" : '$item_id', 
       "rental_id" : "$_id", 
       "name" : "$name" 
      } 
} } }); 

Compte tenu de vos données d'échantillons, il en résulte

{ 
     "result" : [ 
       { 
         "_id" : 2, 
         "rental_count" : 2, 
         "rentals" : [ 
           { 
             "item_id" : 8, 
             "rental_id" : "3", 
             "name" : "Third rental" 
           }, 
           { 
             "item_id" : 7, 
             "rental_id" : "2", 
             "name" : "Second rental" 
           } 
         ] 
       }, 
       { 
         "_id" : 1, 
         "rental_count" : 1, 
         "rentals" : [ 
           { 
             "item_id" : 6, 
             "rental_id" : "1", 
             "name" : "First rental" 
           } 
         ] 
       } 
     ], 
     "ok" : 1 
} 

Ce n » t avoir le nom exact que vous vouliez, mais en changeant c'est la partie la plus facile et je ne veux pas voler tout le plaisir :-)

+1

Vous avez volé beaucoup de plaisir –

Questions connexes