2013-10-16 70 views
1

所有其他領域我有以下表結構:分組與MongoDB的

出租:

{ 
    '_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", 
} 

我想深受用戶喜歡這種分組租金的列表:

{ 
    '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" 
     }, 
    ] 
} 

如何你可以用mongodb做到這一點(如果需要,我可以使用聚合框架)。

我已經試過這樣的事情:

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

但它永遠不會工作,因爲我已經在許多不同組的租房信息,我想爲每個用戶在單個陣列中的所有租金。

+0

也許MapReduce可以幫助你在這裏。 – Philipp

回答

1

,您張貼彙總查詢比較合適,只有你必須一個對象傳遞給$addToSet

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

鑑於你的樣本數據,這導致

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

這沒有按」 t確切地命名你想要的,但改變這是最簡單的部分,我不想竊取所有的樂趣:-)

+1

你偷了很多有趣的事情 –