实际项目中,mongodb踩得坑
-
背景:
- 最近项目中项目中用到mongodb集群,以前用过redis,第一次用mongodb,开始的想法是都是nosql,应该差不多,但是真正用的时候才发现,都是nosql,坑不一样的蹲法。这里记录一下遇到的一些问题。后续再有遇到,继续完善。
- 常用的mongodb操作语句
- spring+mongodb分页查询报错
1、常用的mongodb操作语句
- 登陆:mongo –port 27017
- 显示DB:show dbs
- 进入某DB:use test_cswuyg
- 删除表:db.表名.drop()
- 先进入,再删除db库:db.dropDatabase()
- 显示集合:show tables
查看collections:show collections
从指定的机器上复制指定数据库数据到某个数据库:db.copyDatabase(“mydb”, “temp”, “127.0.0.1”);将本机的mydb的数据复制到temp数据库中
导出数据:./bin/mongoexport -d test -c students -o students.json
参数说明:- h:指明数据库宿主机的IP
- u:指明数据库的用户名
- p:指明数据库的密码
- d:指明数据库的名字
- c:指明collection的名字
- f:指明要导出那些列
- o:指明到要导出的文件名
- q:指明导出数据的过滤条件
2、spring+mongodb分页查询报错
先贴出来报的错(太多了,只帖最重要的):
Caused by: com.mongodb.MongoException: Runner error: Overflow sort stage buffered data usage of 33558005 bytes exceeds internal limit of 33554432 bytes
意思很明显:排序时,内存不够了。原因:mongodb分页查询的时候,先将数据在内存中排个序,排好序之后再根据skip,limit查询。所以数据量大了,排序占用的内存就多了(其实我的数据也不大,1G左右)。
亲测解决方案:给排序字段加索引。
加索引写法:
//在字段age 上创建索引,1(升序);-1(降序),这里两种写法,应该都可以。建表时创建;
db.你的collection.createIndex({"你的字段": -1})
如:db.users.ensureIndex({age:1})
//已存在大量数据,后台执行创建,backgroud设为true即可
db.t3.ensureIndex({age:1} , {backgroud:true})
查看索引:
db.你的collecton.getIndexes();
删除索引:
//删除你的collecton中的所有索引
db.你的collecton.dropIndexes()
//删除你的collecton中的firstname 索引
db.你的collecton.dropIndex({name: 1})