MapReduce Mongodb Node JS 原生驱动

发布于 2024-11-10 05:53:38 字数 2227 浏览 0 评论 0原文

我正在使用 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 的集合,并且行为是相同的,有人知道这有什么问题吗

? 干杯。

I'm working with the Mongodb native driver using a Map reduce function. Basically I have a mediaId as a key and want to count how many medias loaded and started per mediaId.
So what I've done was:

  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;
    };

In my test collection I have 2 different mediaIds. One with 553 objects and another one with just 1 object. I've putted all in the "started" state to test this so basically the number of count should be equal to the number of played.
When I run the Map/Reduce function it returns to me ( I used the "toArray" function of the mongodb native driver):

[ { _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' } } ]

It seems that one I have just one object the reduce function isn't called ( I did some tests with another collection with more than 100 mediaIds and the behavior was identical. Does anyone have an idea of what is wrong with that?

Thanks A LOT for your time,
Cheers.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

白色秋天 2024-11-17 05:53:38

我算是解决了这个“问题”。
我在 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
    });
};

希望它可以帮助任何遇到同样“问题”的人

I sort of solved the "issue".
I did the filter on the Map Function and not on the Reduce function. Something like this:

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
    });
};

Hope it helps anyone that is having the same "problem"

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文