我有一个适用于集合的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;
}
我想要做的是Finalize只返回通过某个阈值的对象(例如,计数> 10)。目前它仍然返回对象,并且计数只是null。
有什么想法吗?
答案 0 :(得分:2)
我建议您使用聚合框架,因为它更快更容易理解。您的上述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
}
答案 1 :(得分:1)
你不能。
Finalize只能更改值的格式,但不能取消键(它实际上是map阶段发出的键)。