sql >> Databáze >  >> NoSQL >> MongoDB

Najděte počet maximálně po sobě jdoucích záznamů na základě jednoho pole v Mongodb Query

Můžete provést tuto operaci mapReduce.

Nejprve mapovač:

var mapper = function () {


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

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

};

Což udržuje průběžný počet celkových časů, které true hodnota je vidět v příznaku. Pokud je tento počet větší než 1, vyšleme hodnotu the, která také obsahuje dokument _id . Další čítač, který se používá pro klíč, se zvýší, když je příznak false , abyste měli seskupovací "klíč" pro shody.

Potom redukce:

var reducer = function ( key, values ) {

    var result = { docs: [] };

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

    return result;

};

Jednoduše vloží _id hodnoty do pole výsledků spolu s totalCount.

Poté spusťte:

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

Tedy pomocí mapper a reducer funkce, pak definujeme globální proměnné použité v "rozsahu" a předáme "třídění", které bylo vyžadováno na updated_at Termíny. Což dává výsledek:

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

Samozřejmě můžete přeskočit totalCount proměnnou a použijte pouze délku pole, která by byla stejná. Ale protože chcete ten čítač stejně používat, je jen přidán. Ale to je princip.

Takže ano, toto byl problém vhodný pro mapReduce a nyní máte příklad.




  1. mangoose findOne s řazením

  2. Bezplatné nasazení a monitorování databáze s otevřeným zdrojovým kódem s ClusterControl Community Edition

  3. Dokážete najít jeden zápas jako první nebo poslední?

  4. Aktualizace změny licence MongoDB SSPL