Карта Уменьшить собственный драйвер Mongodb Node JS - PullRequest
3 голосов
/ 30 мая 2011

Я работаю с собственным драйвером 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 разных идентификатора носителя.Один с 553 объектами, а другой только с 1 объектом.Я поставил все в состояние «запущено», чтобы проверить это, поэтому в основном количество отсчетов должно быть равно количеству сыгранных.Когда я запускаю функцию Map / Reduce, она возвращается ко мне (я использовал функцию «toArray» собственного драйвера mongodb):

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

Кажется, что у меня есть только один объект, функция сокращения не является 'Я позвонил (я провел несколько тестов с другой коллекцией с более чем 100 медиа-идентификаторами, и поведение было идентичным. Кто-нибудь имеет представление о том, что с этим не так?

Большое спасибо за ваше время, Cheers.

1 Ответ

2 голосов
/ 31 мая 2011

Я вроде как решил "проблему". Я сделал фильтр для функции карты, а не для функции уменьшения. Примерно так:

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

Надеюсь, это поможет любому, у кого такая же "проблема"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...