このmapReduce操作を実行できます。
最初のマッパー:
var mapper = function () {
if ( this.flag == true ) {
totalCount++;
} else {
totalCount = 0;
}
if ( totalCount != 0 ) {
emit (
counter,
{ _id: this._id, totalCount: totalCount }
);
} else {
counter++;
}
};
これは、true
の合計回数の実行カウントを保持します 値はフラグに表示されます。そのカウントが1より大きい場合は、ドキュメント_id
も含む値を出力します。 。フラグがfalse
の場合、キーに使用される別のカウンターがインクリメントされます 、試合のグループ化「キー」を取得するため。
次に、レデューサー:
var reducer = function ( key, values ) {
var result = { docs: [] };
values.forEach(function(value) {
result.docs.push(value._id);
result.totalCount = value.totalCount;
});
return result;
};
_id
をプッシュするだけです totalCountとともに結果配列に値を追加します。
次に実行します:
db.people.mapReduce(
mapper,
reducer,
{
"out": { "inline": 1 },
"scope": {
"totalCount": 0,
"counter": 0
},
"sort": { "updated_at": 1 }
}
)
したがって、mapper
およびreducer
次に、関数を使用して、「scope」で使用されるグローバル変数を定義し、updated_at
で必要な「sort」を渡します。 日付。結果が得られます:
{
"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,
}
もちろん、totalCount
をスキップすることもできます 変数であり、配列の長さを使用します。これは同じです。しかし、とにかくそのカウンターを使用したいので、それは追加されただけです。しかし、それが原則です。
そうです、これはmapReduceに適した問題でした。これで、例があります。