2013-10-16 2 views
1

와 다른 모든 필드 그룹화 나는 다음과 같은 테이블 구조가 있습니다MongoDB를

대여 :

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

방법 :

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

는이 같은 사용자들에 의해 그룹화 대여 목록을 싶습니다을 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 
} 

결과 ' 당신이 원하는 정확한 이름을 가지고 있지만 그 부분을 바꾸는 것이 가장 쉬운 부분이며 모든 재미를 훔치고 싶지는 않습니다 :-)

+1

당신은 엄청난 재미를 훔쳤습니다. –