MongoDB中文网站

https://www.mongodb.org.cn/
MongoDB工具:https://www.mongodb.com/try/download/database-tools
8af5f20f-a48c-46fa-928f-d1ef51f77770

一、安装

1.1、下载源码包解压
[root@61 ~]# cat /shell/mongodb.sh 
#!/bin/bash 
wget -O /opt/src/mongodb-4.4.4.tar http://www.soft72.com/opt/linux-soft/03/mongodb-linux-x86_64-rhel70-4.4.4.tgz
mkdir -p /opt/release/mongodb-4.4.4/
tar -xvf /opt/src/mongodb-4.4.4.tar -C /opt/release/mongodb-4.4.4/
ln -s /opt/release/mongodb-4.4.4/mongodb-linux-x86_64-rhel70-4.4.4/ /usr/local/mongodb
1.2、编辑启动配置文件,可用 mongod --help |less 查询参数
[root@61 ~]# cd /usr/local/mongodb/
[root@61 mongodb]# mkdir -p etc data/db/ log
[root@61 mongodb]# vim ./etc/mongodb.conf
...
dbpath=/usr/local/mongodb/data/db/
logpath=/usr/local/mongodb/log/mongodb.log
fork=true		#守护进程,指启动一个进程在内存中等待连接
logappend=true
bind_ip=192.168.168.61
port=27061
...
1.2、启动
[root@61 mongodb]# tail -2 /etc/profile
export PATH=/usr/local/mongodb/bin:$PATH

[root@61 mongodb]# echo $PATH
/usr/local/mongodb/bin:/root/perl5/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@61 ~]# mongod -f /usr/local/mongodb/etc/mongodb.conf		# 启动 
[root@61 ~]# mongod --shutdown -f /usr/local/mongodb/etc/mongodb.conf	# 停止
[root@61 ~]# tail -2 /etc/bashrc 		#设置别名

二、MongoDB命令

2.1、命令集合

类型

用途

库相关命令

show dbs

查看所有库

db

查看在当前在那个库下

use 库名

创建、切换到该库

db.dropDatabase()

删除库,必须使用use切换到该库下

集合(表)相关命令

插入数据

insert

插入数据时,如果指定_id,且_id已存在,则插入不进去

save

插入数据时,如果指定_id,且_id已存在,则替换整个文档

find查找

行数显示限制

指定显示(0,1)

1:显示,0不显示。格式:find({条件}{_id:0,name:1})

limit(数字)

只显示前几行:find({}).limit(n)

skip(数字)

跳过前几行:find({}).skip()

sort(字段名:1/-1)

升降序,1升序,-1降序。find({}).sort(age:1或-1)

find查找2

基本匹配

$in

范围内,find(字段名:{$in:{值1,值2,值3}})

$nin

not in,不在。。范围内,用法同上

$or

逻辑或。find({$or:[{字段1:值},{字段2:值}]})

逻辑与

find({字段1:值},{字段2:值})

find查找3

正则匹配

. * ^ $ |

用法:find({字段名:/正则条件/})

数值比较

数值比较

$lt $lte

用法:find({字段名:{lte:数值2}}) #匹配条件存在“且”

$gt $gte

$ne

null

匹配空值:find({字段名:null}) 输出所有包含空值的列

更新update

默认只更新匹配到的第一行

false,true。两个参数联合使用代表修改匹配到的所有行

$set

修改。update({条件},{$set:{修改的字段1,修改的字段2}})

$unset

删除。update({条件},{$unset:{修改的字段}},false,true)

$inc

update({条件},{$inc:{条件:±n}}).#自加自减,一次只能修改一个

$push

向数组中添加新元素,可以重复添加

$addToSet

避免重复添加

$pop[-1,1]

#一次只能删除一个,1删除数组尾部元素,-1删除数组头部元素

$pull

#删除数组中指定元素

删除表,字段

drop

删除集合(表)。db.c1.remove({}),db.c1.remove({name:“bob”})

remove

删除文档(行)。db.c1.drop()

变量

案例

a=({name:“bob”})---->db.c1.(a)

2.2、库命令
[root@60 ~]# mongo --host 192.168.168.60 --port 27060
> show dbs			#查看有哪些库,默认有3个
admin   0.000GB
config  0.000GB
local   0.000GB
> db				#默认在db库里
test
show dbs
db
use 库名			#没有则创建,延时创建(在该库内创建表后,用show dbs才会显示)
db.dropDatabase()	#删除库,必须使用use切换到该库下才能删除
2.3、表命令
show collections 或 show tables #查看表,查看集合
db.集合名.drop()					#删除集合
db.集合名.save({"key":"values","":""})	#创建集合,集合不存在时,创建并添加文档(一个{}代表一个文档,一个文档是一行,,用“,”间隔列)
db.集合名.count()				#查看行数
db.集合名.find().pretty()			#查看所有行,pretty可选
db.集合名.find({name:"bob"})		#指定范围查找
db.集合名.findOne()		#返回一条文档
db.集合名.remove({})		#删除所有文档
db.集合名.remove({条件},justOne=1(可选))	#指定删除,删除第一行,1代表true
db.集合名.update({匹配条件},{$set:{新update},{参数}})
2.4、插入数据
  • insert()与save()的区别
insert()	#插入数据时,如果指定_id,且_id已存在,则插入不进去
save()		#插入数据时,如果指定_id,且_id已存在,则替换整个文档
2.5、查询
  • find1:参数
格式:
find({条件},{输出哪些内容})[skip(num),limit(num),sort(1,-1)]
{0,1}		#0:false,1:true显示
skip(num)	#跳过多少行
limit(num)	#只输出前多少行
sort(字段名)	#1升序,-1降序
案例:
db.c1.find({},{_id:0}).skip(10).limit(5)	#输出第11~15行,{}匹配所有,不输入_id列
db.c1.find({uid:1},{_id:0,name:1,uid:1,homedir:1}).sort({uid:1}).pretty()
  • find2:基本匹配
格式:
find({条件1,条件2},{_id:0})		#条件1与条件2是"且"关系
$in: #in,find({列名:{$in:[值1,值2,值3]}},{_id:0})
$nin #not in
$or: #或,find({$or:[{条件1},{条件2},{条件3}]},{_id:0})
$in 案例
> db.c1.find({uid:{$in:[1,2,3]}},{_id:0,uid:1,name:1})
{ "name" : "bin", "uid" : 1 }
{ "name" : "daemon", "uid" : 2 }
{ "name" : "adm", "uid" : 3 }

$nin 案例
> db.c1.find({uid:{$nin:[1,2,3]}},{_id:0,uid:1,name:1}).limit(5)
{ "name" : "yaya", "uid" : 100 }
{ "name" : "root", "uid" : 0 }
{ "name" : "lp", "uid" : 4 }
{ "name" : "sync", "uid" : 5 }
{ "name" : "shutdown", "uid" : 6 }
$or 案例
> db.c1.find({$or:[{name:"bin"},{uid:0}]},{_id:0,name:1,uid:1})
{ "name" : "root", "uid" : 0 }
{ "name" : "bin", "uid" : 1 }
  • find3:正则匹配与数值比较
正则匹配
[. * ^ $ | ]
find({字段名:/正则条件/})

数值比较
$lt  $lte  $gt  $gte $ne
find({字段名:{$gte:数值1,$lte:数值2}})	#匹配条件存在“且”

null 匹配空值
find({列名:null})
输出所有包含空值的列
> db.c1.find({name:/^a|t$/},{_id:0,name:1})		#匹配以a开头或以t结尾
{ "name" : "root" }
{ "name" : "adm" }
{ "name" : "halt" }
{ "name" : "libstoragemgmt" }
{ "name" : "abrt" }
{ "name" : "apache" }

> db.c1.find({name:/^r..t$/},{_id:0,name:1})	#匹配以r开头,t结尾
{ "name" : "root" }
> db.c1.find({name:/^r.*t$/},{_id:0,name:1})
{ "name" : "root" }
> db.c1.find({uid:{$gte:10,$lte:40}},{_id:0,name:1,uid:1})
{ "name" : "operator", "uid" : 11 }
{ "name" : "games", "uid" : 12 }
{ "name" : "ftp", "uid" : 14 }
{ "name" : "rpc", "uid" : 32 }
{ "name" : "ntp", "uid" : 38 }
2.5、update更新数据
  • mongodb注入能拼接语句吗_数据库_02unset
# 默认只更新与条件匹配的第一行
update({条件},{$set:{修改的字段1,修改的字段2}})	#只修改匹配到的第一行
update({条件},{$set:{修改的字段}},false,true)	#false,true代表修改所有匹配到的

$set:条件匹配时,修改指定字段的值
$unset:删除与条件匹配文档的字段
db.c1.update({uid:{$lte:3}},{passwd:"xxx"})		#完全覆盖匹配到的结果第一条
db.c1.update({uid:{$lte:3}},{$set:{passwd:"F",gid:12345}})
db.c1.update({uid:{$lte:3}},{$set:{passwd:"F",gid:12345}},false,ture)
  • $inc
$inc
update({条件},{$inc:{条件:+-n}})		#自加自减,默认一次只能修改一个
> db.c1.update({uid:1},{$inc:{uid:1}})
> db.c1.update({uid:2},{$inc:{uid:-1}})
  • $push, $addToSet
$push 向数组中添加新元素,可以重复添加
$addToSet 避免重复添加
格式:
update({匹配条件},{$push:{数组名:"值"}})
update({匹配条件},{$addToSet:{数组名:"值"}})

db.c2.update({name:"bob"},{$addToset:{likes:"w"}})
  • mongodb注入能拼接语句吗_nosql_03pull
$pop[-1,1] 	#一次只能删除一个,1删除数组尾部元素,-1删除数组头部元素
$pull		#删除数组中指定元素
> db.c2.find({name:"bob"},{_id:0})
{"name" : "bob", "likes" : [ "a", "b", "c", "d", "w", "w", "ww" ] }
> db.c2.update({name:"bob"},{$pop:{likes:-1}})		#删除尾部元素
> db.c2.update({name:"bob"},{$pop:{likes:1})		#删除头部元素
> db.c2.find({name:"bob"},{_id:0})
{"name" : "bob", "likes" : [ "b", "c", "d", "w", "w" ] }

> db.c2.update({name:"bob"},{$pull:{likes:"b"}})	#删除列表中指定元素
> db.c2.find({name:"bob"},{_id:0})
{ "name" : "bob", "likes" : [ "c", "d", "w", "w" ] }
2.6、删除
  • drop 删除集合(表)
  • remove 删除文档(行)
> db.c1.remove({name:"bob"})	#指定删除文档
> db.c1.remove({})			#删除所有文档
> db.c1.drop()
  • 定义变量
ducument=({name:"bob",age:20})
db.集合名.save(document)
  • 案例
> db.c2.save({"name":"a1"})
WriteResult({ "nInserted" : 1 })
> db.c2.save({"id":123})
WriteResult({ "nInserted" : 1 })
> db.c2.find()
{ "_id" : ObjectId("60409cf9e3cdd3fd1635ebe3"), "name" : "a1" }
{ "_id" : ObjectId("60409d1fe3cdd3fd1635ebe4"), "id" : 123 }
  • MongoDB官方案例
>db.col.insert({  
	title: 'Mongodb 教程',  
	description: 'MongoDB 是一个 Nosql 数据库',   
	by: 'Mongodb中文网',   
	url: 'http://www.mongodb.org.cn',   
	tags: ['mongodb', 'database', 'NoSQL'],  
	likes: 100  
})

三、数值类型

  • string字符串
  • bool(true、false)
  • 空null({pay:null})
  • 数值
shell默认使用64位浮点数型数值。解释:MongoDB数值类型默认为64位浮点型
NumberInt(4字节整数) 例如: {id:NumberInt(123)}
NumberLong(8字节整数) {id:NumberLong(12345)}
  • 数组
  • 代码 {x:function(){/* code */}}
db.c1.insert({codename:"python",codeformat:function(){/*print(123)*/}})
  • 对象 {stuid:ObjectId()}
  • 日期 {birth:new Date()}
  • 内嵌 (文档可嵌套其他文档)db.c2.save({info:{name:“bob”,sex:“boy”,age:20},class:{stuid:1234}})
  • 正则 {x:/正则表达式/}

四、导入导出

  • mongoexport:导出
  • mongoimport:导入
  • json/csv #导出导入格式
4.1、 json格式案例:适合导出整张表
mongoexport --host --port --type --db 库名 -c 集合名 > /目录/*.json
[root@61 ~]# mongoexport --host 192.168.168.61 --port 27061 --type=csv --db=gametest -c c1 > /mongodir/gametest.c1.csv
mongoimport --host --port --type --db -c /目录/*.json	#库名可以不存在(延时创建)
[root@61 ~]# mongoimport --host 192.168.168.61 --port 27061 --type=json --db=dbsdb -c t1 /mongodir/gametest.c1.json
4.2、 csv格式案例:适合导出指定列
mongoexport --host --port --type=csv --db -c -f 字段1,字段2 /目录/*.csv
[root@61 ~]# mongoexport --host 192.168.168.61 --port 27061 --type csv --db gametest -c c1 -f _id,name > /mongodir/gametest.t1.csv
mongoimport --host --port --type=csv --db -c [--headerline] [--drop] /目录/*.csv
--headerline #导入时使用第一行作为导入的文档结构
--drop		#drop collection before inserting documents
[root@61 ~]# mongoimport --host 192.168.168.61 --port 27061 --type csv --db dbsdb -c t2 --headerline --drop /mongodir/gametest.t1.csv
4.3、 案例
[root@61 mongodir]# cat c3.csv  #在MongoDB中新建一个集合新建一个文档再导出
name,passwd,uid,gid,comment,homedir,shell
yaya,x,100,100,xxx,xxx,xxx
[root@61 mongodir]# cp /etc/passwd ./
[root@61 mongodir]# sed -i '$r passwd' c3.csv  #将passwd导入到c3.csv。"$"代表c3.csv最后一行,r是读,sed读到c3最好一行时导入passwd
[root@61 mongodir]# sed -i 's/:/,/g' c3.csv
[root@61 mongodir]# mongoimport导入

五、备份恢复

  • mongodump #备份
  • mongorestore #恢复
5.1、备份
  • 备份所有的库到当前目录下的dump目录下
mongodump [ --host ip --port 端口 ]
[root@61 dumpdir]# mongodump --host 192.168.168.61 --port 27061
  • 备份时指定备份的库、集合和备份目录
mongodump [ --host ip --port 端口 ] --db 库名 -c 集合名 -o 目录名
[root@61 dumpdir]# mongodump --host 192.168.168.61 --port 27061 -d dbsdb
[root@61 dumpdir]# mongodump --host 192.168.168.61 --port 27061 -d dbsdb -c c3 -o /dumpdir2/
  • bsondump命令查看备份的集合的详细信息
[root@61 dumpdir]#  ls /dumpdir2/dump/dbsdb/
c3.bson  c3.metadata.json
[root@61 dumpdir]# bsondump ./dump/dbsdb/c3.bson
5.2、导入恢复
  • 格式
mongorestore --host --port -d/--db 库名 备份目录名/*.bson
mongorestore --host --port -d 新/旧库名 -c 集合名 目录名/*.bson
  • 案例
[root@61 dumpdir]# mongorestore --host 192.168.168.61 --port 27061 -d studb -c c1  ./dump/dbsdb/c3.bson
# studb是新库
# c1是新集合
[root@61 dumpdir]#  ls /dumpdir2/dump/dbsdb/
c3.bson  c3.metadata.json
[root@61 dumpdir]# bsondump ./dump/dbsdb/c3.bson
5.2、导入恢复
  • 格式
mongorestore --host --port -d/--db 库名 备份目录名/*.bson
mongorestore --host --port -d 新/旧库名 -c 集合名 目录名/*.bson
  • 案例
[root@61 dumpdir]# mongorestore --host 192.168.168.61 --port 27061 -d studb -c c1  ./dump/dbsdb/c3.bson
# studb是新库
# c1是新集合