在MongoDB中,我正在嘗試編寫僅在符合特定條件時才保存數據的Map-Reduce函數。如何不在MongoDB的reduce()函數中保存數據?
我不知道如何而不是從我的reducer 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 }
這很聰明!我將不得不運行它來觀察運行在真實數據上的速度,但這是實現目標的一個很好的技巧。謝謝。 – Kurtis
如果你只是想過濾一些結果,我不會做一個map/reduce。只需在第一張map/reduce之後執行刪除操作:db.mroutput.remove({value:{$ lte:2}})。 remove()將比map/reduce運行得更快。 –
@RobMoore你是對的;這是一個更簡單,更有效的解決方案。我認爲你應該把它作爲一個單獨的答案發布。 – GolfWolf