MongoDB では、特定の基準を満たす場合にのみデータを保存する Map-Reduce 関数を作成しようとしています。
レデューサーからemit()しない方法がわかりません。何らかの方法で常にデータを保存します。
一般的な例を次に示します。データのコンテキストは無視してください。このデータとコードは、この質問のためだけに作成しました。
データセット:
{ "_id" : ObjectId("52583b3a58da9769dda48853"), "date" : "01-01-2013", "count" : 1 }
{ "_id" : ObjectId("52583b3d58da9769dda48854"), "date" : "01-01-2013", "count" : 1 }
{ "_id" : ObjectId("52583b4258da9769dda48855"), "date" : "01-02-2013", "count" : 1 }
{ "_id" : ObjectId("52583b4f58da9769dda48856"), "date" : "01-03-2013", "count" : 4 }
マップ機能:
// Map all data by (date, count)
var map = function() {
var key = this.date;
var value = this.count;
emit(key, value);
}
不要なデータを単純に無視するリデューサー。
// Only save dates which have count > 2
var reducer = function(date, counts) {
var sum = Array.sum(counts);
if (sum > 2) {
return sum;
}
}
結果 (値 1 は無視されませんでした):
{ "_id" : "01-01-2013", "value" : null }
{ "_id" : "01-02-2013", "value" : 1 }
{ "_id" : "01-03-2013", "value" : 4 }
空の return ステートメントも追加しましたが、同じ結果が得られました。
// Only save dates which have count > 2
var reducer = function(date, counts) {
var sum = Array.sum(counts);
if (sum > 2) {
return sum;
}
else return;
}
私が望んでいるのは、Map-Reduce を実行した後、出力コレクションに次のデータのみが存在することです。どうすればこれを達成できますか?
{ "_id" : "01-03-2013", "value" : 4 }