#javascript #mongodb #mapreduce
#javascript #mongodb #mapreduce
Вопрос:
В MongoDB map reduce у меня есть код, который заставляет некоторые документы отображаться, но не уменьшаться. Я свел это к очень простому примеру
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:
Как возможно, что документы не уменьшаются?
Сокращение будет вызываться только тогда, когда вам нужно свести два или более значений в одно значение.
Вы можете видеть это в подписи функции. 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}
}
Обратите внимание, что структура передаваемого значения совпадает с уменьшенным значением.