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.