2013-04-14 28 views
0

我有以下地图:MongoDB的地图减少琐碎的查询

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); }; 

} 

然后我定义减少类似如下:

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" : "[email protected]", 
     "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" 
} 

现在,如果我的火我的地图减少如下:

db.test_views.mapReduce(mapFunction,reduceFunction,{out:{inline:1}}) 

的,我得到如下结果中返回:

{ 
      "_id" : "[email protected]", 
      "value" : { 
        "url" : "checkout", 
        "count" : 1, 
        "account_id" : 123 
      } 
    } 

因此,它基本上回到我的地图。现在,如果我为此电子邮件ID添加另一个文档。最后它变成如下所示。

{ 
     "_id" : ObjectId("516a7cff6dad5949ddf3f7b6"), 
     "ip" : "1.2.3.4", 
     "accId" : 123, 
     "em" : "[email protected]", 
     "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" : "[email protected]", 
     "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" 
} 

然后,我再去和消防地图降低,它给了我正确的结果

{ 
     "_id" : "[email protected]", 
     "value" : { 
       "count_checkout" : 2, 
       "count_landing" : 0 
     } 
} 

任何人都可以请帮我理解为什么它返回我的地图为单一的文件和没有按”不要在减少计数。

感谢您的帮助。

-Lalit

回答

1

谁能请帮助我理解为什么它返回我的地图为单一的文件,并没有做计数减少。

Reduce步骤将具有相同密钥的文档合并到单个结果文档中。如果您的Map函数发出的数据中只有一个关键字,则数据已经“减少”,并且不会调用reduce()。

这是MapReduce算法的预期行为。

0

reduce函数应该返回与map函数发出的相同类型的值对象。
就像你经历过的那样,当有一个与键相关的单值时 - reduce函数根本不会被调用。

MongoDB MapReduce Documentation

用于降低功能

要求:
...
返回对象的类型必须是相同的值的由地图功能发射的类型确保以下操作正确:
reduce(key,[C,reduce(key,[A,B])])== reduce(key,[C,A,B])