Как это возможно, что документы отображаются, но не сокращаются в mongoDB? - PullRequest
3 голосов
/ 01 ноября 2011

При уменьшении карты mongoDB у меня есть код, который вызывает отображение некоторых документов, но не уменьшает их.Я свел это к очень простому примеру

m = function(){
    var a = this.visit_last_action_time.getFullYear()
    var b = this.visit_last_action_time.getMonth()
    var c = this.visit_last_action_time.getDate()
    var key =  new Date(a,b,c)
    emit(key,{greeting:'hi'})
}


r = function(key,values){
    var sum = 0;
        for (index in values) {
            sum ++
        }
    return {count: sum}
}

    result = db.runCommand({
"mapreduce" : "piwik",
"map" : m,
"reduce" : r,
"out" : "temp2",
limit:500})

результат равен

    {
        "result" : "temp2",
        "timeMillis" : 1461,
        "counts" : {
            "input" : 500,
            "emit" : 500,
            "reduce" : 13,
            "output" : 20
        },
        "ok" : 1
    }
> db.temp2.find({})
{ "_id" : ISODate("2011-01-28T00:00:00Z"), "value" : { "count" : 2 } }
{ "_id" : ISODate("2011-01-29T00:00:00Z"), "value" : { "greeting" : "hi" } }
{ "_id" : ISODate("2011-07-11T00:00:00Z"), "value" : { "greeting" : "hi" } }
{ "_id" : ISODate("2011-07-13T00:00:00Z"), "value" : { "greeting" : "hi" } }
{ "_id" : ISODate("2011-07-15T00:00:00Z"), "value" : { "count" : 2 } }
{ "_id" : ISODate("2011-07-16T00:00:00Z"), "value" : { "count" : 7 } }
{ "_id" : ISODate("2011-07-17T00:00:00Z"), "value" : { "count" : 39 } }
{ "_id" : ISODate("2011-07-18T00:00:00Z"), "value" : { "count" : 172 } }
{ "_id" : ISODate("2011-07-19T00:00:00Z"), "value" : { "count" : 248 } }
{ "_id" : ISODate("2011-09-23T00:00:00Z"), "value" : { "count" : 3 } }
{ "_id" : ISODate("2011-09-24T00:00:00Z"), "value" : { "count" : 5 } }
{ "_id" : ISODate("2011-09-25T00:00:00Z"), "value" : { "count" : 4 } }
{ "_id" : ISODate("2011-09-26T00:00:00Z"), "value" : { "count" : 2 } }
{ "_id" : ISODate("2011-09-27T00:00:00Z"), "value" : { "count" : 2 } }
{ "_id" : ISODate("2011-09-28T00:00:00Z"), "value" : { "count" : 5 } }
{ "_id" : ISODate("2011-10-13T00:00:00Z"), "value" : { "greeting" : "hi" } }
{ "_id" : ISODate("2011-10-14T00:00:00Z"), "value" : { "greeting" : "hi" } }
{ "_id" : ISODate("2011-10-15T00:00:00Z"), "value" : { "greeting" : "hi" } }
{ "_id" : ISODate("2011-10-18T00:00:00Z"), "value" : { "greeting" : "hi" } }
{ "_id" : ISODate("2011-10-19T00:00:00Z"), "value" : { "count" : 2 } }

Как вы можете видеть из "привет", здесь происходит нечто странное.

Как возможно, что документы не уменьшаются?

Я использую mongo 2.0

1 Ответ

3 голосов
/ 01 ноября 2011

Как возможно, чтобы документы не сокращались?

Функция Reduce будет вызываться только тогда, когда вам нужно уменьшить два или более значений в одно значение.

Вы можете увидеть это в подписи функции.reduce() принимает массив значений и возвращает единственное значение.

Структура value, излучаемая из map, должна совпадать со структурой, возвращаемой reduce.

ВВ вашем случае ваш код нарушает следующее правило: reduce(key, [a]) => a.

Вам необходимо изменить две вещи:

m = ...
  emit(key,{count:1})
}

r = function(key,values){
    var sum = 0;
    for (index in values) {
        sum += values[index].count
    }
    return {count: sum}
}

Обратите внимание, что структура переданного значения совпадает суменьшенное значение.

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