首页 文章

MongoDB Map Reduce - Finalize跳过一些结果

提问于
浏览
4

我有一个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 .

有任何想法吗?

2 回答

  • 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

    你不能 .
    Finalize将只能更改您的值的格式,但您无法取消键(实际上由 Map 阶段发出的指示) .

相关问题