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

Mongodbクエリの1つのフィールドに基づいて最大連続レコードの数を検索します

    このmapReduce操作を実行できます。

    最初のマッパー:

    var mapper = function () {
    
    
        if ( this.flag == true ) {
            totalCount++;
        } else {
            totalCount = 0;
        }
    
        if ( totalCount != 0 ) {
            emit (
            counter,
            {  _id: this._id, totalCount: totalCount }
        );
        } else {
          counter++;
        }
    
    };
    

    これは、trueの合計回数の実行カウントを保持します 値はフラグに表示されます。そのカウントが1より大きい場合は、ドキュメント_idも含む値を出力します。 。フラグがfalseの場合、キーに使用される別のカウンターがインクリメントされます 、試合のグループ化「キー」を取得するため。

    次に、レデューサー:

    var reducer = function ( key, values ) {
    
        var result = { docs: [] };
    
        values.forEach(function(value) {
            result.docs.push(value._id);
            result.totalCount = value.totalCount;
        });
    
        return result;
    
    };
    

    _idをプッシュするだけです totalCountとともに結果配列に値を追加します。

    次に実行します:

    db.people.mapReduce(
        mapper,
        reducer,
       { 
           "out": { "inline": 1 }, 
           "scope": { 
               "totalCount": 0, 
               "counter": 0 
           }, 
           "sort": { "updated_at": 1 } 
       }
    )
    

    したがって、mapper およびreducer 次に、関数を使用して、「scope」で使用されるグローバル変数を定義し、updated_atで必要な「sort」を渡します。 日付。結果が得られます:

    {
        "results" : [
            {
                "_id" : 1,
                "value" : {
                    "docs" : [
                         3,
                         4
                     ],
                     "totalCount" : 2
                }
            },
            {
                "_id" : 2,
                "value" : {
                "docs" : [
                    7,
                    8,
                    5
                 ],
                 "totalCount" : 3
                 }
            }
        ],
        "timeMillis" : 2,
        "counts" : {
                "input" : 7,
                "emit" : 5,
                "reduce" : 2,
                "output" : 2
        },
        "ok" : 1,
    }
    

    もちろん、totalCountをスキップすることもできます 変数であり、配列の長さを使用します。これは同じです。しかし、とにかくそのカウンターを使用したいので、それは追加されただけです。しかし、それが原則です。

    そうです、これはmapReduceに適した問題でした。これで、例があります。




    1. Mongo/Mongoose-日付で集計

    2. MongoDB集計を使用して、同じドキュメント内の2つのセットのセット交差を検索します

    3. node.jsはオブジェクトをredisに保存します

    4. Javaを使用したMongo3.2ドライバーによる新しい集約機能