MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Finden Sie die Anzahl der maximal aufeinanderfolgenden Datensätze basierend auf einem Feld in der Mongodb-Abfrage

Sie können diese mapReduce-Operation durchführen.

Zuerst der Mapper:

var mapper = function () {


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

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

};

Was eine laufende Zählung der Gesamtzeiten führt, die der true ist Wert wird in Flag gesehen. Wenn diese Zahl größer als 1 ist, geben wir den Wert aus, der auch das Dokument _id enthält . Ein weiterer Zähler, der für den Schlüssel verwendet wird, wird erhöht, wenn das Flag false ist , um einen Gruppierungsschlüssel für die Übereinstimmungen zu haben.

Dann der Reduzierer:

var reducer = function ( key, values ) {

    var result = { docs: [] };

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

    return result;

};

Schiebt einfach die _id -Werte zusammen mit dem totalCount auf ein Ergebnisarray.

Führen Sie dann Folgendes aus:

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

Also mit dem mapper und reducer Funktionen definieren wir dann die in "Scope" verwendeten globalen Variablen und übergeben die "Sortierung", die für updated_at erforderlich war Termine. Was das Ergebnis ergibt:

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

Natürlich könnte man den totalCount einfach überspringen Variable und verwenden Sie einfach die Array-Länge, die gleich wäre. Aber da man diesen Zähler sowieso verwenden möchte, wird er einfach hinzugefügt. Aber das ist das Prinzip.

Also ja, das war ein für mapReduce geeignetes Problem, und jetzt haben Sie ein Beispiel.