来,我给你们看一段神奇的mongodb的mapreduce操作
//regmp.jsprintjson("job start");var map = function() { emit(this.ip, {value: 1});}var reduce = function(key, values) { var count = 0; values.forEach(function(v) {count += v['value']; }); return {count: count };}var res = db.runCommand({mapreduce:"RegistRecord",map:map, reduce:reduce, out:"log_results"});printjson("job end")
/* 0 */{ "_id" : "11.11.11.11", "value" : { "count" : 5.0 }}/* 1 */{ "_id" : "11.11.11.22", "value" : { "count" : 2.0 }}/* 2 */{ "_id" : "11.11.11.33", "value" : { "value" : 1.0 }}
//insert.jsfor(var i=0;i<2000;i++){db.RegistRecord.save({"ip":"11.11.11.11","account":"ongyong"});}for(var i=0;i<2;i++){db.RegistRecord.save({"ip":"11.11.11.22","account":"ongyong22"});}for(var i=0;i<1;i++){db.RegistRecord.save({"ip":"11.11.11.33","account":"ongyong33"});}
/* 0 */{ "_id" : "11.11.11.11", "value" : { "count" : NaN }}/* 1 */{ "_id" : "11.11.11.22", "value" : { "count" : 2.0 }}/* 2 */{ "_id" : "11.11.11.33", "value" : { "value" : 1.0 }}
/* 0 */{ "_id" : "11.11.11.11", "value" : { "count" : [{ "value" : 1.0 }, { "value" : 1.0 }, { "value" : 1.0 }, { "value" : 1.0 }, { "value" : 1.0 }] }}/* 1 */{ "_id" : "11.11.11.22", "value" : { "count" : [{ "value" : 1.0 }, { "value" : 1.0 }] }}/* 2 */{ "_id" : "11.11.11.33", "value" : { "value" : 1.0 }}
/* 0 */{ "_id" : "11.11.11.22", "value" : { "count" : [{ "value" : 1.0 }, { "value" : 1.0 }] }}/* 1 */{ "_id" : "11.11.11.33", "value" : { "value" : 1.0 }}/* 2 */{ "_id" : "11.11.11.11", "value" : { "count" : [{ "count" : [{ "value" : 1.0 }, { "value" : 1.0 }, { "value" : 1.0 }, {。。。。此处省略后面记录
?看!!!最后这条记录!瞎了吧!!!传过来的values值的结构都改变了!!!无缘无故的嵌套了几层count,再用? count += v['value']当然没法进行数值运行啦!!!坑爹啊!!!为什么???
?
注:
Mongodb版本 2.0.1 ,32bit
环境:windowxp 32bit
(少废话,我生产环境当然是用的linux,我这不是做实验么)
我要吃晚饭了先,linux环境我稍后回来继续做~
1 楼 laibin1320 2013-03-17 哥们,我比较关心的是,你们设什么需求的系统呀,为什么用mongodb,而不用传统的rdbms呢? 2 楼 andilyliao 昨天 mongodb看来真得慎用,哈哈,不过做并行运算我还是力挺hadoop。