Mongodb map减少琐碎查询



我有一个下面的地图:

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])

相关内容

  • 没有找到相关文章

最新更新