gpt4 book ai didi

javascript - 文档在 mongoDB 中如何被映射但没有被减少?

转载 作者:可可西里 更新时间:2023-11-01 09:37:47 25 4
gpt4 key购买 nike

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

正如您从“hi”中看到的,这里发生了一些奇怪的事情。

怎么可能文档没有减少?

我正在使用 mongo 2.0

最佳答案

How is it possible that documents are not getting reduced?

只有当您需要将两个或多个值缩减为一个值时,才会调用 Reduce。

您可以在函数的签名中看到这一点。 reduce() 接受值数组并返回单个值。

map 发出的 value 的结构应该与 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}
}

请注意发射值的结构如何与减少的值相同。

关于javascript - 文档在 mongoDB 中如何被映射但没有被减少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7960841/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com