数据的导入、导出、备份、恢复
以下涉及到到的数据库以mydb为例,表以user为例:
- 数据导出
->./mongoexport -d mydb -c user -o user.dat
- 导出csv格式(-f 后面指定导出列)
->./mongoexport -d mydb -c user -f uid,username,age -o user_csv.dat
- 导入json格式
->./mongoimport -d mydb -c user user.dat
- 导入csv格式( headerline挑明不导入第一行,因为第一行是列名)
->./mongoimport -d mydb -c user --type csv --headerline --file user_csv.dat
- 数据备份(默认备份在当前目录下新建的dump目录中)
->./mongodump -d mydb
- 数据备份(指定目录)
->./mongodump -d mydb -o mydb_dump
- 数据恢复
->./mongorestore -d mydb mydb_dump/*
访问控制
- 绑定内网ip和设置监听端口,在启动mongo数据库时指定
->./mongod --bind_ip 192.168.1.1 --port 28018
访问需要指定ip和端口 ,不然会报错:->./mongo 192.168.1.1:28018
- 使用用户名和密码登录(如果在admin中没有添加用户是默认直接访问的)
->./mongo
>db.addUser("root","111")
>db.auth("root","111")
然后再访问就需要指定用户了->./mongo -u root -p
命令行操作
- 通过eval参数执行语句
->./mongo mydb --eval "printjson(db.user.count())"
- 执行文件中的内容
user_count.js文件内容:var totalcount=db.user.count(); printjson('Total count of user is: ' + totalcount())
执行user_count.js文件->./mongo mydb user_count.js
进程控制
- 查看活动进程
>db.currentOp();
- 结束进程
>db.killOp(1234/*opid*/)
索引创建和使用(1:升序,-1:降序)
- 单个索引
>db.user.ensureIndex({age:1})
>db.user.getIndexes();
- 文档索引
>db.user.insert({name:"Tom",addr:{city:"Wuhan",state:"WH"}})
在addr上创建索引>db.user.ensureIndex({addr:1})
>db.user.find({addr:{city:"Wuhan",state:"WH"}}),此查询不会用到索引,因为查询的顺序和索引建立的顺序不一样
- 组合索引
db.user.ensureIndex({addr.city:1,addr.state:1})
下面操作都会用到此索引
db.user.find({addr.city:"Wuhan",addr.state:"WH"})
db.user.find({addr.city:"Wuhan"})
db.user.find().sort({addr.city:1,addr.state:1})
db.user.find().sort({addr.city:1})
- 唯一索引
>db.user.insert({name:"Lily",age:18})
>db.user.insert({name:"Lily",age:18})
>db.user.ensureIndex({name:1,age:1},{unique:true}); 创建时会报错,原因是表中有两条一模一样的数据
- 删除索引
>db.user.dropIndexes()
>db.user.dropIndex({age:1}); 删除指定字段的索引
性能优化
-创建索引
如果需要读取的数据量很大,在查询条件的字段上或者排序条件的字段上创建索引,可以显著提高执行效率
- 限定返回结果条数
使用limit()限定返回结果集的大小,可以减少程序运行的资源消耗以及减少网络传输数量
- 只查询用到的字段,不查询所有字段
只查询需要用到的字段比查询所有字段效率更高
- 采用 capped collection
1. 固定大小,Capped Collections必须事先创建,并设置大小:>db.createCollection("mycoll", {capped:true, size:100000})
2. Capped Collections 可以insert和update操作,不能delete操作,只能用drop()方法删除整个Collection
3. 默认基于insert的次序排序的。如果查询时没有排序,则总是按照insert的顺序返回
4. FIFO。如果超过了Collection的限定大小,则用FIFO算法,新纪录将代替最先insert的记录
- 采用Server Side Code Execution
Server-Side Processing 类似于SQL数据库的存储过程
- Hint可以强制要求查询操作使用某个索引
如果要查询多个字段的值,如果在其中一个字段上有索引,可以使用hint ,>db.collection.find({user:u, foo:d}).hint({user:1})
-采用Profiling
Profiling使用的是system.profile来记录,而system.profile是一个capped collection,这种collection在操作上有一些限制和特点,但是效率更高