2013-08-05 4 views
4

У меня есть карта уменьшить функцию, которая работает над коллекцией следующим образом:MongoDB Карта Уменьшить - Доработка пропустить некоторые результаты

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; 
} 

То, что я пытаюсь сделать, это то, что Доработка будет возвращать только объекты, которые пропускам определенный порог (например, count> 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

Спасибо Дерик. Я не могу использовать агрегацию, так как есть еще одна логика для карты/сокращения, которую я не использовал для упрощения вопроса. – checklist

+0

Просьба указать, что в вопросе ... A/F более мощный, чем вы думаете! – Derick

+0

Я добавил более сложный пример, когда счетчик должен быть больше 3 ИЛИ один из элементов отмечен – checklist