2012-04-16 2 views
0

GridFS를 사용하여 이미지를 저장하고 있습니다. 각 이미지의 메타 데이터에는 group_id이 있는데, 원본 데이터가 동일한 원본 이미지의 일부인 경우 기본적으로 정의됩니다. 각 이미지는 여러 크기를 가지므로 group_id은 같은 이미지를 함께 묶는 그룹입니다.중첩 결과가있는 MongoDB 그룹

이 질문을하고 싶지만 group_id로 그룹화했습니다. 그래서 그것은 group_id의 배열을 반환 할 것이고 각각은 객체의 정보 (너비, id 등)를 갖습니다. 내가 그룹과 맵리 듀스 검토 한

[ { _id: 4f871d4adaf6fa492f000001, 
    width: '500', 
    group: '1' }, 
    { _id: 4f871d4adaf6fa492f000004, 
    width: '150', 
    group: '1' }, 
    { _id: 4f871d4bdaf6fa492f000007, 
    width: '100', 
    group: '1' }, 
    { _id: 4f871d4bdaf6fa492f00000a, 
    width: '50', 
    group: '1' }, 
    { _id: 4f871d51daf6faf42e000001, 
    width: '500', 
    group: '2' }, 
    { _id: 4f871d52daf6faf42e000004, 
    width: '150', 
    group: '2' }, 
    { _id: 4f871d53daf6faf42e000007, 
    width: '100', 
    group: '2' }, 
    { _id: 4f871d53daf6faf42e00000a, 
    width: '50', 
    group: '2' } ] 

, 다양한 옵션을하지만 아무것도 작동하는 것 같다 없다을 시도 :

난 그냥 내가 원하는 기록에 발견 할 경우이는 모습입니다 . 어떤 제안이나 예도 좋을 것입니다!

감사합니다.

답변

1

이 작업을 수행하는 한 가지 방법은 (버전 2.1.0에서 사용 가능) 새로운 통합 프레임 워크에서 $ 그룹 기능입니다 : http://www.mongodb.org/display/DOCS/Aggregation+Framework+-+%24group

> db.images.aggregate({$group:{"_id":"$group", "info":{$push:{"width":"$width", "id":"$_id"}}}}) 
{ 
    "result" : [ 
     { 
      "_id" : "2", 
      "info" : [ 
       { 
        "width" : "500", 
        "id" : ObjectId("4f871d51daf6faf42e000001") 
       }, 
       { 
        "width" : "150", 
        "id" : ObjectId("4f871d52daf6faf42e000004") 
       }, 
       { 
        "width" : "100", 
        "id" : ObjectId("4f871d53daf6faf42e000007") 
       }, 
       { 
        "width" : "50", 
        "id" : ObjectId("4f871d53daf6faf42e00000a") 
       } 
      ] 
     }, 
     { 
      "_id" : "1", 
      "info" : [ 
       { 
        "width" : "500", 
        "id" : ObjectId("4f871d4adaf6fa492f000001") 
       }, 
       { 
        "width" : "150", 
        "id" : ObjectId("4f871d4adaf6fa492f000004") 
       }, 
       { 
        "width" : "100", 
        "id" : ObjectId("4f871d4bdaf6fa492f000007") 
       }, 
       { 
        "width" : "50", 
        "id" : ObjectId("4f871d4bdaf6fa492f00000a") 
       } 
      ] 
     } 
    ], 
    "ok" : 1 
} 
> 

이 당신이 달성 기대했던 결과인가?

var map = function(){ 
    var info = [{"width":this.width, "id":this._id}]; 
    emit(this.group, {"info":info}); 
} 

var reduce = function(key, values){ 
    var info = []; 
    print(key); 
    print(values.length); 
    for(var v in values){ 
     print(values[v]); 
     for(var i in values[v].info){ 
      if(info.indexOf(values[v].info[i]) == -1){ 
       info.push(values[v].info[i]); 
      }; 
     }; 
    }; 
    return {"info":info}; 
} 

> db.images.mapReduce(map, reduce, {out:{inline:1}}) 
{ 
    "results" : [ 
     { 
      "_id" : "1", 
      "value" : { 
       "info" : [ 
        { 
         "width" : "500", 
         "id" : ObjectId("4f871d4adaf6fa492f000001") 
        }, 
        { 
         "width" : "150", 
         "id" : ObjectId("4f871d4adaf6fa492f000004") 
        }, 
        { 
         "width" : "100", 
         "id" : ObjectId("4f871d4bdaf6fa492f000007") 
        }, 
        { 
         "width" : "50", 
         "id" : ObjectId("4f871d4bdaf6fa492f00000a") 
        } 
       ] 
      } 
     }, 
     { 
      "_id" : "2", 
      "value" : { 
       "info" : [ 
        { 
         "width" : "500", 
         "id" : ObjectId("4f871d51daf6faf42e000001") 
        }, 
        { 
         "width" : "150", 
         "id" : ObjectId("4f871d52daf6faf42e000004") 
        }, 
        { 
         "width" : "100", 
         "id" : ObjectId("4f871d53daf6faf42e000007") 
        }, 
        { 
         "width" : "50", 
         "id" : ObjectId("4f871d53daf6faf42e00000a") 
        } 
       ] 
      } 
     } 
    ], 
    "timeMillis" : 1, 
    "counts" : { 
     "input" : 8, 
     "emit" : 8, 
     "reduce" : 2, 
     "output" : 2 
    }, 
    "ok" : 1, 
} 
> 

는 희망이 당신이 원하는 결과를 달성하는 데 도움이 될 것입니다 :

유사한 결과는 또한 작동 감소지도로 달성 될 수있다!

+0

예, 결과가 정확합니다. 불행히도 2.0.3 버전이므로 여기에서 업데이트 할 수 없습니다. – dzm

+0

대단히 감사합니다! – dzm