mongdb及它的mapreduce的坑

跟老同事交流,发现很多团队都不用mongodb了,由于工作原因,必须使用,后来发现里面的坑不少,下面列一些,希望有助于大家解决棘手的问题


1,导出导入数据。

用mongovue导出的数据(默认配置),再导入到另外一个库里面,报

Error occurred during import
JSON reader was expecting a value but found ','.
Type: System.IO.FileFormatException
Stack:    在 MongoDB.Bson.IO.JsonReader.ReadBsonType[TValue](BsonTrie`1 bsonTrie, Boolean& found, TValue& value)
   在 MongoDB.Bson.IO.BsonReader.ReadBsonType()
   在 MongoDB.Bson.IO.BsonReader.GetCurrentBsonType()
   在 MangoUI.MCollections.Import(String db, String coll, String filepath, Boolean journal, Boolean previewOnly, Boolean stopOnError)
   在 MangoUI.WinInsertDoc.kImport_Click(Object sender, EventArgs e)

读下来感觉,多了个逗号,导出的时候把逗号去掉即可,下面是导出导入示例:




这样就能正常导出导入了。


2,使用mapreduce,发现丢数据

出现这种情况,是因为数据格式不统一,比如,有这两条:


{
  "_id" : ObjectId("564c51776350ff9fa5e8003d"),
  "username" : "张建清",
  "assignid" : 1230,
}
{
  "_id" : ObjectId("564c51776350ff9fa5e8003e"),
  "username" : "张建清",
  "assignid" : "1234",
}

assignid字段有时是整形,有时是字符串,这样会影响其它行的数据丢失。这个问题特别坑人,你发现,有丢失数据的部分,全部是正常的且数据格式是统一的,而数据格式不统一的,却不会丢失数据。

解决:把数据格式除了时间以外,统一转成字符串的,


3,获取ObjectId中的字符串

可以这样: var id= this._id+"";


4,执行javascript脚本

选择数据库,右键菜单中选择“Add Stored Javascript", 然后在弹出框里面输入方法名,是方法名,这个很重要。

双击方法,编写脚本(下图的2),保存,然后选择more,输入方法名,记得加上圆括号(下图的5),最后点击Execute,就执行了,日志什么的,只能通过返回值查看,这个也很坑




5, 用脚本添加一个方法:

执行

db.system.js.save(
{ _id: "getYMD",
value : function(ldate) { var date=new Date();
date.setTime(ldate);
var month=(date.getMonth()+1).toString();
var day=date.getDate().toString();
if(month.length<2){
month="0"+month;
}
if(day.length<2){
day="0"+day;
}

return date.getFullYear().toString()+month+day; }
}
)

测试:
db.eval( "getYMD(1462949232517)" )


6, mongodb统计的时候丢数据的问题

// 这个会丢数据,特别是超过100条的时候

db.runCommand({ mapreduce: "results", 
  map : function Map() {
     emit(
         {grade:this.grade},
         {score:this.score}
     );
 },
  reduce : function Reduce(key, values) {
     var reduced = {recnum:0,score:0};
     values.forEach(function(val){
             reduced.score += val.score;
             ++reduced.recnum; // reduced.recnum+=1;//也会丢数据
         });
     return reduced;
 },
 finalize : function Finalize(key, reduced) { 
         return reduced;
 },
 out : { inline : 1 }
 });


// 下面的统计是正常的

db.runCommand({ mapreduce: "results", 
  map : function Map() {
     emit(
         {grade:this.grade},
         {recnum:1,score:this.score}
     );
 },
  reduce : function Reduce(key, values) {
     var reduced = {recnum:0,score:0};
     values.forEach(function(val){
             reduced.score += val.score;
             reduced.recnum+=val.recnum;
         });
     return reduced;
 },
 finalize : function Finalize(key, reduced) { 
         return reduced;
 },
 out : { inline : 1 }
 });


参考:http://www.tuicool.com/articles/MB3uM3


不足之处,望大家补充

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值