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.