sql >> Base de Datos >  >> NoSQL >> MongoDB

Encuentre el recuento de registros consecutivos máximos en función de un campo en Mongodb Query

Puedes hacer esta operación mapReduce.

Primero el mapeador:

var mapper = function () {


    if ( this.flag == true ) {
        totalCount++;
    } else {
        totalCount = 0;
    }

    if ( totalCount != 0 ) {
        emit (
        counter,
        {  _id: this._id, totalCount: totalCount }
    );
    } else {
      counter++;
    }

};

Lo que mantiene una cuenta corriente del total de veces que true el valor se ve en la bandera. Si ese recuento es mayor que 1, emitimos el valor, que también contiene el documento _id . Otro contador que se usa para la clave se incrementa cuando la bandera es false , con el fin de tener una "clave" de agrupación para los partidos.

Entonces el reductor:

var reducer = function ( key, values ) {

    var result = { docs: [] };

    values.forEach(function(value) {
        result.docs.push(value._id);
        result.totalCount = value.totalCount;
    });

    return result;

};

Simplemente presiona el _id valores en una matriz de resultados junto con totalCount.

Luego ejecuta:

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

Entonces con el mapper y reducer funciones, luego definimos las variables globales utilizadas en "alcance" y pasamos la "clasificación" que se requería en updated_at fechas. Lo que da el resultado:

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

Por supuesto, podría omitir totalCount variable y solo use la longitud de la matriz, que sería la misma. Pero dado que desea usar ese contador de todos modos, simplemente se agrega. Pero ese es el principio.

Así que sí, este era un problema adecuado para mapReduce, y ahora tienes un ejemplo.