2013-08-05 19 views
4

我有地圖縮小功能上集合的工作原理如下:的MongoDB的Map Reduce - 最後確定跳過某些結果

function Map() { 
    emit (
     this.name, 
     { 
      count : 1, 
      flag : this.flag 

     } 
    ); 
} 
function Reduce(key, values) { 
    var count = 0; 
    var flag = false; 

    for (var i in values){ 
     count = count + 1; 
     if (i.flag) 
      flag = true; 
    } 

    var reduced = { 
     count : count, 
     flag : flag 
    } 
    return reduced; 
} 
function Finalize(key, reduced) { 

    if (reduced.count>10 || reduced.flag){ 
     var finalized = { 
      "count" : reduced.count 
     } 
     return reduced; 
    } 

    return null; 
} 

我所試圖做的是,最終確定將只返回傳遞一個對象某個閾值(例如,計數> 10)。目前它仍然返回對象,計數只是空值。

任何想法?

回答

1

我建議你使用聚合框架,因爲它更快,更容易理解。你上面的M/R/F可爲容易寫成:

db.so.insert({ name: "Derick" }); 
db.so.insert({ name: "Derick" }); 
db.so.insert({ name: "Derick" }); 
db.so.insert({ name: "Derick" }); 
db.so.insert({ name: "Checklist" }); 
db.so.insert({ name: "Checklist" }); 
db.so.insert({ name: "Whoop" }); 
db.so.insert({ name: "Whoop", flagged: true }); 
db.so.aggregate([ 
    { $group: { 
     _id: '$name', 
     count: { $sum: 1 }, 
     flagged: { $sum: 
      { $cond: [ { $eq: [ '$flagged', true ] }, 1, 0 ] } 
     } 
    } }, 
    { $match: { $or: [ { count: { $gt: 3 } }, { flagged: { $gt: 0 } } ] } } 
]); 

將返回:

{ 
    "result" : [ 
     { 
      "_id" : "Whoop", 
      "count" : 2, 
      "flagged" : 1 
     }, 
     { 
      "_id" : "Derick", 
      "count" : 4, 
      "flagged" : 0 
     } 
    ], 
    "ok" : 1 
} 
+0

由於德里克。我不能使用聚合,因爲map/reduce有更多的邏輯,我沒有把它放在簡化問題的地方。 – checklist

+0

請在問題中提供... A/F比您想象的更強大! – Derick

+0

我已經添加了一個更復雜的例子,其中計數應該超過3或其中一個項目被標記 – checklist