0

GridFS を使用して画像を保存しています。各画像には、group_id基本的に同じ元の画像の一部であるかどうかを定義するだけのメタデータがあります。したがって、各画像には複数のサイズがありgroup_id、同じ画像をグループ化するものです。

これを照会したいのですが、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' } ]

group と mapreduce を調べ、さまざまなオプションを試しましたが、何も機能しないようです。どんな提案や例も素晴らしいでしょう!

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

4

1 に答える 1

1

これを行う 1 つの可能な方法は、新しい集計フレームワーク (バージョン 2.1.0 で利用可能) の $group 関数を使用することです: 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
}
> 

これはあなたが達成したいと望んでいた結果ですか?

Map Reduce 操作でも同様の結果が得られる場合があります。

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,
}
> 

うまくいけば、これはあなたが望む結果を達成するのに役立ちます!

于 2012-04-16T20:27:53.837 に答える