mongdb及它的mapreduce的坑
来源:互联网 发布:开淘宝企业店铺多少钱 编辑:程序博客网 时间:2024/06/05 16:46
跟老同事交流,发现很多团队都不用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
不足之处,望大家补充
- mongdb及它的mapreduce的坑
- MongDB索引的介绍及使用
- 超越之MongDB系列教程(八) MongDB的集合及GridFS
- mongdb的基本使用
- mongdb的基本使用
- MongDb的增删改
- 单纯的Mongdb学习
- Mongdb的常用命令
- mongdb的查询深入
- mongdb的插入深入
- mongdb的更新深入
- MongDb的增删改
- mapreduce机制及mapreduce任务的分析
- Mongdb分布式计算MapReduce
- MongDB 的适用场景之一
- mongdb的安装与使用
- MongDB的用户认证管理
- MongDB的增删查改
- Gradle学习笔记(二)
- Java-----使用JNI调用本地方法
- JSP语法的练习
- 七牛---关于Node.js SDK的各种Demo
- android的消息处理机制(图+源码分析)——Looper,Handler,Message
- mongdb及它的mapreduce的坑
- 设备驱动的艺术之旅 - 驱动和内核的关系
- 关于图像加密域检索的几种方法
- 0C-013.OC中的description方法
- Linux与windows之间-文件传输工具RZSZ
- codeforces 417A Elimination
- 杭电oj 1013
- 设备驱动的艺术之旅 - Watch Dog 的 NMI 应用场景
- js的浮点运算问题