Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mongodb mapreduce返回不一致的结果_Mongodb_Mapreduce_Mongoid - Fatal编程技术网

mongodb mapreduce返回不一致的结果

mongodb mapreduce返回不一致的结果,mongodb,mapreduce,mongoid,Mongodb,Mapreduce,Mongoid,我有一个超级简单的地图还原测试。。。这并不是始终如一的。简而言之,我只是在寻找重复的记录。我有一个收藏: 吉夫蒂迪亚 -站点id -站点密钥 站点id+站点密钥应该是唯一的,但当前不是。因此,我有以下map reduce代码: var map = function() { print(this.site_key); emit(this.site_id + this.site_key, 1); }; var reduce = function(key,values) { v

我有一个超级简单的地图还原测试。。。这并不是始终如一的。简而言之,我只是在寻找重复的记录。我有一个收藏:

吉夫蒂迪亚 -站点id -站点密钥

站点id+站点密钥应该是唯一的,但当前不是。因此,我有以下map reduce代码:

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; 
};
使用此输入数据:

吉夫蒂迪亚
-站点id:amazon-站点密钥:2 -站点id:amazon-站点密钥:2
-站点id:amazon-站点密钥: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 亚马逊2=>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. 一,

关键字:amazon1值:2 Sat 8月28日 13:22:50[conn582]建立新索引 关于{0:1}for personalizr_test.tmp.mr.mapreduce_1283016170_139_inc 8月28日星期六13:22:50[康涅狄格州582] 构建索引 personalizr_test.tmp.mr.mapreduce_1283016170_139_inc idxNo:0{ns: “personalizr_test.tmp.mapreduce_1283016170_139_inc.”, 键:{0:1},名称:“0_1”} 28 13:22:50[康涅狄格州582]完成2分钟 记录0秒8月28日星期六13:22:50 [conn582]在{u id: 1}用于 personalizr_test.tmp.mr.mapreduce_1283016170_139 8月28日星期六13:22:50[康涅狄格州582] 构建索引 personalizr_test.tmp.mr.mapreduce_1283016170_139 idxNo:0{name:“id”,ns: “personalizr_test.tmp.mapreduce_先生1283016170_139”, 钥匙:{u id:1}星期六8月28日13:22:50 [conn582]已完成0条记录0秒 键:amazon1值:1键:amazon2 数值:1周六8月28日13:22:50 [conn582]命令:放下 personalizr_test.tmp.mr.mapreduce_1283016170_139_inc 8月28日星期六13:22:50[conn582]指令: 放弃个性化测试。所有想法 按重点分组Sat 8月28日13:22:50 [conn582]端部连接 127.0.0.1:56135

1、2、1表示映射功能工作正常。这是顺序正确的项,但是reduce函数看起来很奇怪。我为amazon1调用了reduce两次,第二次,值不正确。另一件事是,在第一次调用之后,mongo似乎正在创建一个索引。我猜它会等待第一个数据,以确定数据格式将是什么,从而可以适当地生成索引。但我不明白为什么我会接到这个电话: 键:amazon1值:1调用

有什么建议吗

其他一些有趣的花絮: mongo 1.6.1 mongoid 2.0.0.beta16 bson 1.0.4 bson_分机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" }

建议?

好的,感谢艾略特·霍洛维茨的建议。他告诉我我的还原功能不正确。 Reduce可以重新运行,因此您需要执行以下操作:

var reduce=函数(键、值){ var总和=0; 用于(值中的var i){ 总和+=数值[i]; 打印(键+“:”+和); } 回报金额;
};

嗨,我遇到了一个问题,mongo对某些字段进行了“重新”分组,所以我遇到了重复的字段。当我使用你的解决方案时,它成功了!我不知道还有什么问题,有什么帮助吗?