mongodb mapreduce возвращает противоречивые результаты

У меня есть очень простой тест уменьшения карты... который не работает последовательно. Короче говоря, я просто ищу повторяющиеся записи. У меня есть коллекция, в которой есть:

GiftIdea - site_id - site_key

site_id + site_key должны быть уникальными, но в настоящее время это не так. Итак, у меня есть следующий код уменьшения карты:

var map = function() { 
   print(this.site_key); 
   emit(this.site_id + this.site_key, 1);
};
var reduce = function(key,values) { 
   var sum=0;
   for(var i in values){ 
      print(key + ": " + ++sum); 
   } 
   return sum; 
};

С этими входными данными:

GiftIdea
-site_id: amazon -site_key:2 -site_id: amazon -site_key: 2
-site_id: amazon -site_key: 1

Итак, я должен получить:

амазон1 => 2 амазон2 => 1

Вот что происходит, когда я запускаю его

> o = db.gift_ideas.mapReduce(map,reduce)                                                                        
{
    "result" : "tmp.mr.mapreduce_1283015268_136",
    "timeMillis" : 5,
    "counts" : {
        "input" : 3,
        "emit" : 3,
        "output" : 2
    },
    "ok" : 1,
}

Хорошо, отличные новости, я испустил 3 строки и вывел 2. Но я получаю:

амазон1 => 1.00000 амазон2 => 1.00000

В моем файле журнала у меня есть:

Сб 28 авг 13:22:50 [conn582] CMD: удалить personalizr_test.tmp.mr.mapreduce_1283016170_139 Сб 28 авг 13:22:50 [conn582] CMD: удалить personalizr_test.tmp.mr.mapreduce_1283016170_139_inc 1 2 1

Ключ: amazon1 Значения: 2 Сб, 28 августа, 13:22:50 [conn582] создание нового индекса для {0:1} для personalizr_test.tmp.mr.mapreduce_1283016170_139_inc, сб, 28 августа, 13:22:50 [conn582] Создание индекса personalizr_test.tmp. mr.mapreduce_1283016170_139_inc idxNo:0 { ns: "personalizr_test.tmp.mr.mapreduce_1283016170_139_inc", ключ: { 0: 1 }, имя: "0_1" } сб 28 августа 13:22:50 [conn582] сделано для 2 записей 0 секунд сб 28 августа 13:22:50 [conn582] создание нового индекса для {_id: 1} для personalizr_test.tmp.mr.mapreduce_1283016170_139 сб 28 августа 13:22:50 [conn582] Buildindex personalizr_test.tmp.mr.mapreduce_1283016170_139 { idxNo:039 name: "id", ns: "personalizr_test.tmp.mr.mapreduce_1283016170_139", key: { _id: 1 } } Sat Aug 28 13:22:50 [conn582] сделано для 0 записей 0secs Key . test.Все идеи сгруппированы по ключу Сб 28 августа 13:22:50 [conn582] end connection 127.0.0.1:56135

1, 2, 1 означает, что функция карты работает правильно. Это правильные элементы в правильном порядке, но функция сокращения выглядит странно. Я вызываю сокращение для amazon1 дважды, и во второй раз значение неверно. Другое дело, что после первого вызова монго создает индекс. Я предполагаю, что он ждет первых данных, чтобы выяснить, какими будут форматы данных, чтобы он мог соответствующим образом сгенерировать индекс. Но я не понимаю, почему мне звонят: Ключ: amazon1 Значения: 1 звонок

Какие-либо предложения?

Несколько других интересных моментов: mongo 1.6.1 mongoid 2.0.0.beta16 bson 1.0.4 bson_ext 1.0.4

Действительно странно то, что tt работает с другой базой данных с реальными данными!

Вот как выглядит одна из записей в заполненной базе данных:

{ "_id" : ObjectId("4c69b7164914e54d9b007c34"), "avg_score" : null, "category_ids" : [ ], "created_at" : "Thu Aug 19 2010 05:57:25 GMT-0400 (EDT)", "desc" : null, "enabled" : null, "idea_ratings" : [ ], "images" : [
    {
        "url" : "http://ecx.images-amazon.com/images/I/515cLXdLUNL._SL75_.jpg",
        "_id" : ObjectId("4c69b7164914e54d9b007c35"),
        "height" : 61,
        "width" : 75
    }
], "num_ratings" : null, "owner_id" : null, "price" : -1, "rating_stats" : { "_id" : ObjectId("4c7746877719ad0712000dc8"), "total" : -1, "count" : 1, "average" : -1, "sum_of_weights" : 1 }, "ratings" : null, "response_groups" : [ ], "sales_rank" : 40751, "site_id" : "amazon", "site_key" : "B00001OPJE", "title" : "SNK NEOGEO Pocket Color Console in Platinum Silver", "updated_at" : "Fri Aug 27 2010 21:34:40 GMT-0400 (EDT)", "url" : "http://www.amazon.com/NEOGEO-Pocket-Color-Console-Platinum-Silver/dp/B00001OPJE?SubscriptionId=1VHSF1NEXNWHR2A8BA82&tag=gifter-20&linkCode=xm2&camp=2025&creative=165953&creativeASIN=B00001OPJE" }

А вот и один из моих образцов

{ "_id" : ObjectId("4c7948667719ad410f000005"), "created_at" : "Sat Aug 28 2010 13:33:26 GMT-0400 (EDT)", "enabled" : true, "rating_stats" : { "_id" : ObjectId("4c7948667719ad410f00000d"), "total" : 2, "count" : 2, "average" : 1, "sum_of_weights" : 2 }, "sales_rank" : 10, "site_id" : "amazon", "site_key" : "1", "title" : "title1", "updated_at" : "Sat Aug 28 2010 13:33:26 GMT-0400 (EDT)", "url" : "url1" }

Предложения?


person Jeff D    schedule 28.08.2010    source источник


Ответы (1)


Хорошо, спасибо Элиоту Горовицу за это. Он сказал мне, что моя функция сокращения неверна. Reduce можно запустить повторно, поэтому вам нужно сделать что-то вроде:

var уменьшить = функция (ключ, значения) { var sum=0; for(var i in values){ сумма += values[i]; печать (ключ + ": " + сумма); } сумма возврата; };

person Jeff D    schedule 28.08.2010
comment
Привет, у меня была проблема, что монго перегруппировывал определенные поля, поэтому я столкнулся с дубликатами. Когда я использовал ваше решение, оно сработало! Я не знаю, в чем проблема, любая помощь? - person Ayush Chaudhary; 06.07.2012