【问题标题】:MongoDB Map Reduce - Finalize to skip some resultsMongoDB Map Reduce - 完成以跳过一些结果
【发布时间】:2013-08-06 09:46:38
【问题描述】:

我有一个适用于集合的 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 只会返回通过某个阈值(例如 count>10)的对象。目前它仍在返回对象,计数为空。

有什么想法吗?

【问题讨论】:

    标签: mongodb mapreduce finalize


    【解决方案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
    }
    

    【讨论】:

    • 谢谢德里克。我不能使用聚合,因为 map/reduce 有更多逻辑,我没有为简化问题而添加。
    • 请在问题中提供... A/F 比你想象的更强大!
    • 我添加了一个更复杂的示例,其中计数应大于 3 或其中一个项目被标记
    • 刚刚在匹配中为您修复了这个问题... $match 只是一个查询。
    • 这并不能解决复杂操作所需的 mapReduce finalize 过滤器问题,或者至少比聚合可以处理的更复杂。
    【解决方案2】:

    你不能。
    Finalize 只会改变你的值的格式,但你不能取消键(这实际上是由 map 阶段发出的)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 2013-05-25
      • 1970-01-01
      相关资源
      最近更新 更多