【问题标题】:Map Reduce Mongodb Node JS native driverMap Reduce Mongodb Node JS 原生驱动
【发布时间】:2011-05-30 18:11:54
【问题描述】:

我正在使用 Map reduce 函数处理 Mongodb 本机驱动程序。基本上我有一个 mediaId 作为键,并想计算每个 mediaId 加载和启动的媒体数量。 所以我所做的是:

  var map = function(){
        emit(this.media.id, {
            count: 1,
            played: 0,
            ph: this.project.id,
            title: this.media.title,
            media: this.media.id,
            origin: this.origin,
            thumbnail: this.media.thumbnail,
            mediaDuration: this.media.mediaDuration,
            state: this.state
        });
    };

    var reduce = function(k, vals) {
        result = {
            count: 0,
            played: 0,
            ph: '',
            title: '',
            media: '',
            origin: '',
            thumbnail: '',
            mediaDuration: 0,
            state: ''
        };

        vals.forEach(function(doc){
            result.count += doc.count;
            result.ph = doc.ph;
            result.title = doc.title;
            result.media = doc.media;
            result.thumbnail = doc.thumbnail;
            result.mediaDuration = doc.mediaDuration;
            result.state = doc.state;
            result.origin = doc.origin;
            if(doc.state === "started") {
                result.played += 1;
            }
        });
        return result;
    };

在我的测试集合中,我有 2 个不同的 mediaId。一个有 553 个对象,另一个只有 1 个对象。我已经把所有的都放在“开始”状态来测试这个,所以基本上计数的数量应该等于播放的数量。 当我运行 Map/Reduce 函数时,它会返回给我(我使用了 mongodb 本机驱动程序的“toArray”函数):

[ { _id: '12398asdsa9802193810asd120',
value: 
 { count: 1,
   played: 0,
   ph: '123213ased12231',
   title: 'xxxxxxxxxxxxxxxxxxxxxxxxxxx',
   media: '1xxxxxxxxxxxxxxxxxxxxxxxxxxx1',
   origin: 'http://www.google.com',
   thumbnail: 'http://cache.ohinternet.com/images/0/0e/Forever_Alone.png',
   mediaDuration: 12321321,
   state: 'started' } },
{ _id: '2c9f94b42f5b5114012f5b92ea430066',
value: 
 { count: 553,
   played: 155,
   ph: '316',
   title: 'xxxxxxxxxxxxxxxxxxxxxxxxxxx',
   media: '2xxxxxxxxxxxxxxxxxxxxxxxxxxx2',
   origin: 'http://localhost:9000/views/index.html',
   thumbnail: null,
   mediaDuration: null,
   state: 'started' } } ]

似乎我只有一个对象未​​调用 reduce 函数(我对另一个具有 100 多个 mediaId 的集合进行了一些测试,并且行为相同。有人知道这有什么问题吗?

非常感谢您的宝贵时间, 干杯。

【问题讨论】:

    标签: mongodb node.js mapreduce


    【解决方案1】:

    我有点解决了“问题”。 我对 Map 函数而不是 Reduce 函数进行了过滤。像这样的:

    var map = function(){
        if(this.media.state==="started") {
           var played = 1;
    }else{var played = 0;}
        emit(this.media.id, {
            count: 1,
            played: played,
            ph: this.project.id,
            title: this.media.title,
            media: this.media.id,
            origin: this.origin,
            thumbnail: this.media.thumbnail,
            mediaDuration: this.media.mediaDuration,
            state: this.state
        });
    };
    

    希望对遇到同样“问题”的人有所帮助

    【讨论】:

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