我有一个超级简单的地图缩小测试...这不是一致的。简而言之,我只是在寻找重复的记录。我有一个集合:
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
所以我应该得到:
amazon1 => 2 amazon2 => 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.但是我得到了:
amazon1 => 1.00000 amazon2 => 1.00000
在我的日志文件中,我有:
8月28日星期六13:22:50 [conn582] CMD:drop personalizr_test.tmp.mr.mapreduce_1283016170_139 8月28日星期六13:22:50 [conn582] CMD:drop personalizr_test.tmp.mr.mapreduce_1283016170_139_inc 1 2 1
Key:amazon1价值观:2月8日星期六 13:22:50 [conn582]建立新的指数 在{0:1}上 personalizr_test.tmp.mr.mapreduce_1283016170_139_inc 8月28日星期六13:22:50 [conn582] Buildindex 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秒星期六8月28日13:22:50 [conn582]在{_id上建立新索引: 1} for personalizr_test.tmp.mr.mapreduce_1283016170_139 8月28日星期六13:22:50 [conn582] Buildindex personalizr_test.tmp.mr.mapreduce_1283016170_139 idxNo:0 {name:“ id ”,ns: “personalizr_test.tmp.mr.mapreduce_1283016170_139” key:{_ id:1}} 8月28日星期六13:22:50 [conn582]完成0记录0secs 关键:amazon1值:1键:amazon2 价值观:1月8日星期六13:22:50 [conn582] CMD:下降 personalizr_test.tmp.mr.mapreduce_1283016170_139_inc 8月28日星期六13:22:50 [conn582] CMD: drop personalizr_test.All ideas 按键分组8月28日星期六13:22:50 [conn582]结束连接 127.0.0.1:56135
1,2,1表示地图功能正常工作。这是正确顺序的正确项目,但reduce函数看起来很奇怪。我两次为amazon1调用reduce,第二次,值不正确。另一件事是它看起来像第一次调用后,mongo正在创建一个索引。我猜它等待第一个数据,弄清楚数据格式是什么,所以它可以适当地生成索引。但我不明白为什么我接到电话: 密钥:amazon1值:1次呼叫
有什么建议吗?
很少有其他有趣的花絮: 蒙戈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" }
建议?
答案 0 :(得分:2)
好的,感谢Eliot Horowitz就此而言。他告诉我,我的减少功能不正确。 Reduce可以重新运行,因此您需要执行以下操作:
var reduce = function(key,values){ var sum = 0; for(var i in values){ sum + = values [i]; print(key +“:”+ sum); } 回报; };