MongoDB 基本操作

Aug 19, 2015


服务

启动

cd mongodb/bin
./mongod --config mongodb.conf

mongodb.conf的内容如下:

dbpath=/mongodb_absolute_path/mongodb/db
logpath=/mongodb_absolute_path/mongodb/logs/mongodb.log
port=27017
fork=true
nohttpinterface=true	

关闭

./mongo -host ip:port  	#进入mongodb
>use  admin 		#使用admin库
>db.shutdownServer(); 	#关闭服务

基本操作

全局

help                                     #mongodb支持的命令
show dbs                                 #查看所有数据库

use test                                 #使用 test 库
db                                       #查看当前连接在哪个数据库

db.dropDatabase()                        #删除当前的数据库
db.test.drop()                           #删除collection test

db.help()                                #当前数据库支持哪些方法
db.test.help()                           #当前数据库下的表支持的方法

show collections                         #查看所有的collection

存储

db.test.save(...)

删除

db.test.remove({'yy':5})                  #删除yy=5的记录 
db.test.remove({})                        #删除所有的记录

释放存储

mongoldb删除记录后存储并不会释放
如果要释放存储可以:先删除记录,再导出数据,再导入数据

remove…
mongodump -o path
mongorestore -d database_name path

修改

根据query条件修改,如果不存在则插入,允许修改多条记录

db.test.update({'yy':5},{'$set':{'xx':2}},upsert=true,multi=true)

查找

db.test.find()                            #查找所有
db.test.findOne()                         #查找一条记录
db.test.find({'msg':'Hello 1'}).limit(10) #根据条件检索10条记录

模糊查询

tname字段包含关键字“aa”

db.test.find({"tname": {$regex: 'aa', $options:'i'}}) 
db.test.find({"tname": {$regex:/aa.*/i}}) 

逻辑查询

  1. 大于,小于,大于或等于,小于或等于
    $gt:大于(greater than)
    $lt :小于(less than)
    $gte:大于或等于(greater than or equal to)
    $lte :小于或等于(less than or equal to)

     db.test.find({ "field" : { $gt: value } } );  
     db.test.find({ "field" : { $lt: value } } );  
     db.test.find({ "field" : { $gte: value } } );  
     db.test.find({ "field" : { $lte: value } } );  
     # 分别查询大于3,小于4:
     db.test.find({ "field" : { $gt: 3}});  
     db.test.find({ "field" : { $lt: 4}});  
     # 查询同时大于3,小于4:
     db.test.find({ "field" : { $gt: 3, $lt: 4} } ); 
    
  2. 不等于 $ne

     db.test.find( { "field" : { $ne : 3 } } );
    
  3. in 和 not in ($in $nin)

     db.test.find({ "field" : { $in : array } } );
     eg:
     db.test.find({ "field" : { $in: [2,4,6]}});
     db.test.find({ "field" : { $nin: [2,4,6]}});
    
  4. 取模运算($mod)

     如下面的运算:
     db.test.find( "this.a % 10 == 1")
     可用$mod代替:
     db.test.find( { a : { $mod : [ 10 , 1 ] } } )
    
  5. $all
    $all和$in类似,但是他需要匹配条件内所有的值:
    如有一个对象:
    { a: [ 1, 2, 3 ] }
    下面这个条件是可以匹配的:

     db.test.find( { "field" : { $all: [ 2, 3 ] } } );
    

    但是下面这个条件就不行了:

     db.test.find( { "field" : { $all: [ 2, 3, 4 ] } } );
    
  6. $exists
    $exists用来判断一个元素是否存在:

     db.test.find( { "field" : { $exists : true } } ); // 如果存在元素a,就返回
     db.test.find( { "field" : { $exists : false } } ); // 如果不存在元素a,就返回
    
  7. 正则表达式

     db.test.find( { "field" : /acme.*corp/i } ); // 后面的i的意思是区分大小写
    

导入导出

首先定义导入导出基本上会用到的参数:ip、port、user、pwd

[normal] = [-h ip] [—-port port] [-u user] [-p pwd]

导出库

./mongodump [normal] [-d dbname] -o path
-d:有则导出制定库,无则导出所有库

导入库

./mongorestore [normal] [-d dbname] [--drop] path
--drop:先删除当前数据,然后恢复备份的数据,慎用

导出表

./mongoexport [normal] -d dbname -c 表名 -f 字段 -q 条件 -o 文件
eg:
./mongoexport -d test -c students -o students.dat
./mongoexport -d test -c students --csv -f classid,name,age -q '{"age":30}' -o students_csv.dat

导入表

./mongoimport [normal] -d dbname -c 表名 --upsert 字段 --drop 文件
--upsert 插入或者更新现有数据,和--upsertFields一样
eg:
./mongoimport -d test -c students students.dat
./mongoimport -d test -c students --upsertFields classid,name,age students_csv.dat
./mongoimport -d test -c students --type csv --headerline --file students_csv.dat 
—-type:指明要导入的文件格式
—-headerline:指明第一行是列名,不需要导入
—-file:指明要导入的文件

附录

启动参数

--quiet			# 安静输出 
--port arg		# 指定服务端口号,默认端口27017 
--bind_ip arg		# 绑定服务IP,若绑定127.0.0.1,则只能本机访问,不指定默认本地所有IP 
--logpath arg		# 指定MongoDB日志文件,注意是指定文件不是目录 
--logappend		# 使用追加的方式写日志 
--pidfilepath arg	# PID File 的完整路径,如果没有设置,则没有PID文件 
--keyFile arg		# 集群的私钥的完整路径,只对于Replica Set 架构有效 
--unixSocketPrefix arg	# UNIX域套接字替代目录,(默认为 /tmp) 
--fork			# 以守护进程的方式运行MongoDB,创建服务器进程 
--auth			# 启用验证 
--cpu			# 定期显示CPU的CPU利用率和iowait 
--dbpath arg		# 指定数据库路径 
--diaglog arg		# diaglog选项 0=off 1=W 2=R 3=both 7=W+some reads 
--directoryperdb	# 设置每个数据库将被保存在一个单独的目录 
--journal		# 启用日志选项,MongoDB的数据操作将会写入到journal文件夹的文件里 
--journalOptions arg	# 启用日志诊断选项 
--ipv6			# 启用IPv6选项 
--jsonp			# 允许JSONP形式通过HTTP访问(有安全影响) 
--maxConns arg		# 最大同时连接数 默认2000 
--noauth		# 不启用验证 
--nohttpinterface	# 关闭http接口,默认关闭27018端口访问 
--noprealloc		# 禁用数据文件预分配(往往影响性能) 
--noscripting		# 禁用脚本引擎 
--notablescan		# 不允许表扫描 
--nounixsocket		# 禁用Unix套接字监听 
--nssize arg (=16)	# 设置信数据库.ns文件大小(MB) 
--objcheck		# 在收到客户数据,检查的有效性, 
--profile arg		# 档案参数 0=off 1=slow, 2=all 
--quota			# 限制每个数据库的文件数,设置默认为8 
--quotaFiles arg	#  number of files allower per db, requires --quota 
--rest			# 开启简单的rest API 
--repair		# 修复所有数据库run repair on all dbs 
--repairpath arg	# 修复库生成的文件的目录,默认为目录名称dbpath 
--slowms arg (=100)	# value of slow for profile and console log 
--smallfiles		# 使用较小的默认文件 
--syncdelay arg (=60)	# 数据写入磁盘的时间秒数(0=never,不推荐) 
--sysinfo		# 打印一些诊断系统信息 
--upgrade		# 如果需要升级数据库