为什么使用mongodb mapreduce将reduce函数的结果反馈为reduce

时间:2013-06-20 15:51:37

标签: mongodb mapreduce

我看到使用mongo执行渐进式地图缩减任务的一种令人困惑的行为。输入集合是包含以下内容的大量文档:

{_ id:,url:'来自我时髦网站的一些网址'}

这是我的简单地图功能:

    map: function() {

        emit(this.url, {count: 1, id: this._id});

    }

减少(下面显示的日志的大量调试打印):

    reduce: function (key, values) {
        var count = 0;
        var lastId = null;
        var first = null;

        if (typeof values[0].id == "undefined") {
            print("bad id");
            printjson(key);
            printjson(values[0]);
            return null;
        } else {
            print ("good id");
            printjson(key);
            printjson(values[0]);
        }

        first = ObjectId(values[0].id).getTimestamp();

        values.forEach(function(v) {

            count += v.count;

            last = ObjectId(v.id).getTimestamp();

            lastId = v.id;

        });

        return {
            count: count, 
            first: first, 
            last: lastId, 
            lastCounted: lastId
        };
    }

以下是我调用mapreduce的方法:

        mrparams.out = {reduce: this.output};
        mrparams.limit = 100;

        mrparams.query = {'_id': {'$gt': mongoId(lastId.toHexString())}};
                    mrparams.finalize = null;


        mrdb.mapReduce(this.map, this.reduce, mrparams, function(d) {
            console.log("Finished mr", d);
            callback();
        });

这是以cron类型的方式完成的,因此每个时间间隔,作业都是以记录之后的记录的限制数量运行之前运行的lastId。

非常基本的增量地图减少了东西...

但是,当我运行它时,我看到reduce methond的返回值被传递回reduce方法。这是日志的快照:

XXXgood id “http://www.nytimes.com/2013/04/23/technology/germany-fines-google-over-data-collection.html” {“count”:1,“id”:ObjectId(“5175a065b25f029a1d0927e6”)}

好的身份 “http://www.nytimes.com/2013/04/23/world/middleeast/israel-hagel-iran.html” {“count”:1,“id”:ObjectId(“5175a065d7f115dd41097df6”)}

好的身份 “http://www.nytimes.com/interactive/2013/04/22/sports/boston-moment.html” {“count”:1,“id”:ObjectId(“5175a0657c9c963654094d25”)}

YYYThu Jun 20 11:42:11 [conn19938]查询vox.system.indexes查询:{ns:“vox.tmp.mr.pi_analytics_spark_trending_inventories_6667_inc”} nreturned:1 reslen:131 0ms Thu Jun 20 11:42:11 [conn19938]查询 vox.tmp.mr.pi_analytics_spark_trending_inventories_6667 nreturned:9 reslen:1716 0ms

ZZZbad id “http://www.nytimes.com/2013/04/22/business/comedy-central-to-host-comedy-festival-on-twitter.html” {     “数”:2,     “第一个”:ISODate(“2013-04-22T20:41:11Z”),     “last”:ObjectId(“5175a067b25f029a1d092802”),     “lastCounted”:ObjectId(“5175a067b25f029a1d092802”) }

坏身份证 “http://www.nytimes.com/2013/04/22/business/media/in-boston-cnn-stumbles-in-rush-to-break-news.html” {     “数”:7,     “第一”:ISODate(“2013-04-22T20:41:09Z”),     “last”:ObjectId(“5175a067d7f115dd41097e3c”),     “lastCounted”:ObjectId(“5175a067d7f115dd41097e3c”) }

XXX - 我的map函数发出的一堆记录(包含count和id的值) YYY - 甚至是我不熟悉的某种mongo ZZZ - 事件发生后,reduce会被前减少作业的输出调用......

TLDR,当我运行map reduce时,减少很好,直到mongo进程运行,然后我开始看到先前reduce函数的返回值传递到我的reduce函数。

知道为什么/如何做到这一点?

运行mongo 2.0.6

提前致谢

1 个答案:

答案 0 :(得分:0)

我弄明白了这种情况。将map reduce工作的输出放入已存在的集合中时,mongo将通过reduce函数传递新缩减的文档和输出集合中已经使用相同键的文档。

如果您从map中发出的值以及从reduce返回的值具有一致的格式,则无缝地工作。

这根本没有很好的记录,但是现在我已经弄明白了,我的挫败感已经变成了一种聪明的感觉。痛苦的教训。未来的美好时光。