2012-04-16 27 views
0

私はGridFSを使って画像を保存しています。各画像には、同じ原画像の一部であるかどうかを基本的に定義するメタデータがgroup_idにあります。各画像に複数のサイズがあるので、group_idは同じ画像をグループ化するものです。MongoDBグループbyネストされた結果

私はこれをクエリしたいですが、group_idでグループ化します。したがって、オブジェクトの情報(幅、IDなど)を持つgroup_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' } ] 

私はグループとのMapReduceで見てきた、とさまざまなオプションを試してみましたが、何も動いていないようにみえ。どんな提案や例も素晴らしいでしょう!

ありがとうございました!

答えて

1

これを行うための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

関連する問題