sql >> データベース >  >> NoSQL >> MongoDB

機能別のMongoDBグループ

    MongoDB グループ化 たとえば、ほとんどの場合、非常に制限されています

    - the result set must be lesser than 10000 keys.
    - it will not work in sharded environments
    

    したがって、mapreduceを使用することをお勧めします。したがって、クエリは次のようになります

    map =function(){emit({a:true、b:true}、{count:1}); }

    reduce = function(k, values) {
        var result = {count: 0};
        values.forEach(function(value) {
            result.count += value.count;
        });
        return result;
    }
    

    そして

    db.list.mapReduce(map,reduce,{out: { inline : 1}})
    

    その未テストのバージョン。動作するかどうか教えてください

    編集:

    以前のマップ機能に欠陥がありました。そのため、結果が得られません。すべきだった

    map = function () {
        emit({a:this.a, b:this.b}, {count:1});
    }
    

    テストデータ:

    > db.multi_group.insert({a:1,b:2})
    > db.multi_group.insert({a:2,b:2})
    > db.multi_group.insert({a:3,b:2})
    > db.multi_group.insert({a:1,b:2})
    > db.multi_group.insert({a:3,b:2})
    > db.multi_group.insert({a:7,b:2})
    
    
    > db.multi_group.mapReduce(map,reduce,{out: { inline : 1}})
    {
        "results" : [
            {
                "_id" : {
                    "a" : 1,
                    "b" : 2
                },
                "value" : {
                    "count" : 2
                }
            },
            {
                "_id" : {
                    "a" : 2,
                    "b" : 2
                },
                "value" : {
                    "count" : 1
                }
            },
            {
                "_id" : {
                    "a" : 3,
                    "b" : 2
                },
                "value" : {
                    "count" : 2
                }
            },
            {
                "_id" : {
                    "a" : 7,
                    "b" : 2
                },
                "value" : {
                    "count" : 1
                }
            }
        ],
        "timeMillis" : 1,
        "counts" : {
            "input" : 6,
            "emit" : 6,
            "reduce" : 2,
            "output" : 4
        },
        "ok" : 1,
    }
    

    編集2:

    カウント>=2

    の適用を含む完全なソリューション
    map = function () {
        emit({a:this.a, b:this.b}, {count:1,_id:this._id});
    }
    
    reduce = function(k, values) {
        var result = {count: 0,_id:[]};
        values.forEach(function(value) {
            result.count += value.count;
            result._id.push(value._id);
        });
        return result;
    }
    
    >db.multi_group.mapReduce(map,reduce,{out: { replace : "multi_result"}})
    
    > db.multi_result.find({'value.count' : {$gte : 2}})
    { "_id" : { "a" : 1, "b" : 2 }, "value" : { "_id" : [   ObjectId("4f0adf2884025491024f994c"),   ObjectId("4f0adf3284025491024f994f") ], "count" : 2 } }
    { "_id" : { "a" : 3, "b" : 2 }, "value" : { "_id" : [   ObjectId("4f0adf3084025491024f994e"),   ObjectId("4f0adf3584025491024f9950") ], "count" : 2 } }
    


    1. テンプレートで使用するためにMongoDBからHTMLを取得する

    2. インデックスを使用したMongodbMapReduceのパフォーマンス

    3. mongoexportを使用して1つのオブジェクトをエクスポートします。_idを指定するにはどうすればよいですか?

    4. rmongodb:クエリで$またはを使用