Не могу получить Map / Reduce для работы с MongoDB - PullRequest
0 голосов
/ 07 ноября 2011

У меня есть этот код:

// construct map and reduce functions
$map = new MongoCode("
    function() { ".
        "var key = {date: this.timestamp.getFullYear()+this.timestamp.getMonth()+this.timestamp.getDate()};".
        "emit(key, {count: 1});
    }"
);

$reduce = new MongoCode("
    function(k, vals) { ".
        "var sum = 0;".
        "for (var i in vals) {".
            "sum += vals[i];". 
        "}".
        "return sum;".
    "}"
);

$dates = $db->command(array(
    "mapreduce" => "items", 
    "map" => $map,
    "reduce" => $reduce,
    //"query" => array("type" => "sale"),
    "out" => array("merge" => "distinct_dates")
    )
);

Но получите эту ошибку при тестировании:

Массив ([утверждение] => вызов карты не выполнен: ошибка JS: ошибка типа: ошибка типа: this.timestamp.getFullYear не является функцией nofile_b: 0 [assertionCode] => 9014 [errmsg] => ошибка подтверждения db [ok] => 0) Cron run закончен.

У каждого объекта в коллекции есть метка времени, из которой я хочу извлечь дату (Ymd) и поместить каждую отдельную дату в новую коллекцию.

Ответы [ 2 ]

0 голосов
/ 05 декабря 2011

Проблема заключается в том, что ваше поле "timestamp" имеет неправильный тип. Если вы сохранили его как чистую строку, что-то вроде:

"timestamp" : "Wed May 05 2010 15:37:58 GMT-0400 (EDT)"

Вы получите эту ошибку. Если изменить его на следующее, ваша карта будет работать как положено:

new Date("Wed May 05 2010 15:37:58 GMT-0400 (EDT)")

Вы узнаете, что находитесь на правильном пути, когда увидите, что он сохранен в виде объекта ISODate() на выходе Монго.

0 голосов
/ 08 ноября 2011

В MongoDB вы не можете хранить объекты Date как есть.Я полагаю, что ваша временная метка имеет тип int.Надеюсь, если вы определите свою функцию карты таким образом, все будет хорошо:

$map = new MongoCode("
    function(){
         var date = new Date(this.timestamp * 1000) //JS Date need milliseconds 
         var key = date.getFullYear() + date.getMonth() + date.getDate();
         emit(key, {count: 1})
    }
")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...