我有一个下面的地图:
var mapFunction = function() {
if(this.url.match(/http://test.com/category/.*?/checkout/)) {
var key=this.em;
var value = {
url : 'checkout',
count : 1,
account_id:this.accId
}emit(key,value); };
if(this.url.match(/http://test.com/landing/)) {
var key=this.em;
var value = {
url : 'landing',
count : 1,
account_id:this.accId
}emit(key,value); };
}
然后我像下面这样定义了reduce:
var reduceFunction = function (keys, values) {
var reducedValue = {count_checkout:0, count_landing:0};
for (var idx = 0; idx < values.length; idx++) {
if(values[idx].url=='checkout'){
reducedValue.count_checkout++;
}
else {
reducedValue.count_landing++;
}
}
return reducedValue;
}
现在,假设我只有1条记录:
{
"_id" : ObjectId("516a7cff6dad5949ddf3f7b6"),
"ip" : "1.2.3.4",
"accId" : 123,
"em" : "testing@test.com",
"pgLdTs" : ISODate("2013-04-11T18:30:00Z"),
"url" : "http://test.com/category/prr/checkout",
"domain" : "www.test.com",
"pgUdTs" : ISODate("2013-04-14T09:55:11.682Z"),
"title" : "Test",
"ua" : "Mozilla",
"res" : "1024*768",
"rfr" : "www.google.com"
}
现在如果我像下面这样启动map reduce:
db.test_views.mapReduce(mapFunction,reduceFunction,{out:{inline:1}})
I get下面的结果返回:
{
"_id" : "testing@test.com",
"value" : {
"url" : "checkout",
"count" : 1,
"account_id" : 123
}
}
它返回给我地图。现在,如果我为这个邮箱id添加另一个文档。最后变成如下所示:
{
"_id" : ObjectId("516a7cff6dad5949ddf3f7b6"),
"ip" : "1.2.3.4",
"accId" : 123,
"em" : "testing@test.com",
"pgLdTs" : ISODate("2013-04-11T18:30:00Z"),
"url" : "http://test.com/category/prr/checkout",
"domain" : "www.test.com",
"pgUdTs" : ISODate("2013-04-14T09:55:11.682Z"),
"title" : "Test",
"ua" : "Mozilla",
"res" : "1024*768",
"rfr" : "www.google.com"
}
{
"_id" : ObjectId("516a7e1b6dad5949ddf3f7b7"),
"ip" : "1.2.3.4",
"accId" : 123,
"em" : "testing@test.com",
"pgLdTs" : ISODate("2013-04-11T18:30:00Z"),
"url" : "http://test.com/category/prr/checkout",
"domain" : "www.test.com",
"pgUdTs" : ISODate("2013-04-14T09:59:55.326Z"),
"title" : "Test",
"ua" : "Mozilla",
"res" : "1024*768",
"rfr" : "www.google.com"
}
然后,我再次启动map reduce,它给了我正确的结果
{
"_id" : "testing@test.com",
"value" : {
"count_checkout" : 2,
"count_landing" : 0
}
}
有没有人可以帮助我理解为什么它返回给我一个单一文档的地图,而不做减少计数。
谢谢你的帮助。
lalit .
有没有人可以帮助我理解为什么它返回给我一个单一文档的地图,而不做减少计数。
Reduce步骤将具有相同键的文档组合成单个结果文档。如果在Map函数发出的数据中只有一个键,则数据已经被"简化",并且不会调用reduce()。
这是MapReduce算法的预期行为
reduce函数应返回与map函数发出的值对象类型相同的值对象。
就像你所经历的那样,当有一个值与一个键相关联时,reduce函数根本不会被调用。
来自MongoDB MapReduce文档:
reduce函数要求:
…返回对象的类型必须与map函数发出的值的类型相同,以确保以下操作为真:
减少(键,[C,减少(键,[A, B ]) ] ) == 减少(关键[C, A、B])