2013-04-14 4 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" : 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 
     } 
} 

Может кто-нибудь, пожалуйста, помогите мне понять, почему она возвращает мне карту для одного документа и Безразлично» t сделать подсчет в сокращении.

Спасибо за помощь.

-Lalit

ответ

1

Может кто-нибудь, пожалуйста, помогите мне понять, почему она возвращает мне карту для одного документа и не делать подсчет в сократить.

Шаг «Уменьшение» объединяет документы с одним и тем же ключом в единый результирующий документ. Если у вас есть только один ключ в данных, испускаемых вашей функцией Map, данные уже «уменьшены», а функция reduce() не будет вызвана.

Это ожидаемое поведение алгоритма MapReduce.

0

Функция уменьшения должна возвращать объекты такого же типа, что и функция карты.
Как вы уже испытали, когда есть одно значение, связанное с ключом - функция уменьшения вообще не будет вызвана.

От MongoDB MapReduce Documentation:

Требования к снижению функции:
...
тип возвращаемого объекта должен совпадать с типом значения излучаемой функции карты в убедитесь, что выполняются следующие операции:
уменьшить (клавиша, [C, уменьшить (клавиша, [A, B])]) уменьшить (клавиша, [C, A, B])

Смежные вопросы