mongdb及它的mapreduce的坑
跟老同事交流,发现很多团队都不用mongodb了,由于工作原因,必须使用,后来发现里面的坑不少,下面列一些,希望有助于大家解决棘手的问题1,导出导入数据。用mongovue导出的数据(默认配置),再导入到另外一个库里面,报Error occurred during importJSON reader was expecting a value but found ','.
跟老同事交流,发现很多团队都不用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
不足之处,望大家补充
更多推荐
所有评论(0)