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更新数据
- unset
# 默认只更新与条件匹配的第一行
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"}})
- pull
$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是新集合