MongoDB的基本使用与语法
1.启动MongoDB服务端:
- 服务端相关信息:
- 端口号:
27017
- 配置文件:
/etc/mongod.conf
- 端口号:
- 本地测试启动(部分功能):
- 用于验证数据库能否正常运行
- 启动/停止/重启:
sudo service mongod start/stop/restart
- 验证数据库是否正常启动:
grep -v '#' /etc/mongod.conf
- 生产方式启动(完整功能):
- 用于部署启动
- 启动方式:
sudo mongod [--dbpath] [--logpath] [--append] [--fork] [--auth] [-f]
- 不带参数时,要手动创建数据存储目录
/data/db
--dbpath
:指定数据库的存储路径--logpath
:指定日志的存放路径--append
:设置日志的写入形式为追加--fork
:开启新的进程运行MongoDB服务--auth
:以权限认证的方式启动-f 路径
:设置配置文件路径
- 不带参数时,要手动创建数据存储目录
- 验证是否启动成功:
ps -aux | grep mongod
2.启动MongoDB客户端:
- 启动:
mongo
- 退出:
exit
- 查看帮助:
mongo -help
3.MongoDB的常用命令:
- 数据库操作:
- 查看当前数据库:
db
- 查看所有数据库:
show dbs
- 切换数据库:
use 数据库名
- 删除当前数据库:
db.dropDatabase()
- 查看当前数据库:
- 集合操作:
- 自动创建集合:
- 向不存在的集合中第一次添加数据时,集合会被自动创建
- 手动创建:
db.createCollection("集合名")
db.createCollection("集合名",{capped:true,size:x})
capped
:默认值为false,表示没有上限,true则为设置上限size
:集合所占用的最大上限字节数,超出上限则会覆盖之前的数据
- 查看集合:
show collections
- 删除集合:
db.集合名.drop()
- 检查集合是否设有上限:
db.集合名.isCapped()
- 自动创建集合:
4.MongoDB的数据类型:
- 常见类型:
Object ID
:文档/数据ID,数据的主键String
:字符串,必须是utf-8Boolean
:布尔值,true/falseInteger
:整数Double
:浮点数Arrays
:数组/列表Object
:一条数据/文档,即文档嵌套文档Null
:空Timestamp
:时间戳Date
:日期/时间
- 注意点:
- 每个文档都有一个不同的属性(_id),保证每个文档的唯一性
- 可手动设置_id的值,没有手动设置则会自动提供一个独特的_id,类型为objectID
- objectID是一个12字节的十六进制数,每个字节两位,一共是24位的字符串:
- 前4个字节(8位)为时间戳
- 接下来的3个(6位)是机器ID
- 再然后2个(4位)是MongoDB服务进程ID
- 最后3个(6位)是简单的增量值
- 每个文档都有一个不同的属性(_id),保证每个文档的唯一性
5.MongoDB的增删改查:
- 增(插入数据):
- 单条插入:
db.集合名.insert({数据})
db.name.insert({"cjl":19})
- 多条插入:
db.集合名.insert([{数据1},{数据2}])
db.name.insert([{"cjl":19},{"syf":20}])
- 单条插入:
- 删(删除数据):
db.集合名.remove({查询条件},{justOne:boolean})
justOne
:默认false删除全部符合条件的,true删除一条db.name.remove({"age":18},{justOne:true})
- 改(修改数据):
- 保存:
db.集合名.save({_id:"xxx"})
- 通过_id定位到数据,如果存在则修改该数据,不存在则新增该数据
db.name.save({_id:"xxx","name":"cjl"})
- 更新:
db.集合名.update({查询条件},{更新操作符},{multi:boolean})
multi
:默认false只更新第一条,true全部更新,必须和$set
一起使用- 全文档覆盖更新:
db.name.update({name:'x'},{name:'y'})
- 指定键值更新:
db.name.update({name:'x'},{$set:{name:'y')}}
- 更新全部:
db.name.update({},{$set:{age:18}},{multi:true})
- 保存:
- 查(查询数据):
db.集合名.find({条件})
- 查询该集合内的所有符合条件的数据
.pretty()
- 格式化输出
db.集合名.findOne({条件})
- 查询该集合内的第一条数据
db.集合名.find({条件}).count()
- 统计个数查询
db.集合名.distinct("xxx",{条件})
- 去除重复查询
- 相关查询条件:
- 比较运算符:
- 小于:
$lt
- 小等:
$lte
- 大于:
$gt
- 大等:
$gte
- 不等:
$ne
- 小于:
- 逻辑运算符:
- 与关系:
$and
- 简洁格式:
db.name.find({age:{$gt:18},sex:true})
- 复杂格式:
db.name.find({$and:[{age:{$gt:18},sex:true}]})
- 简洁格式:
- 或关系:
$or
db.name.find({$or:[{age:{$gt:18},sex:true}]})
- 与关系:
- 范围运算符:
- 包含:
$in
db.name.find({age:{$in:[18,19,20]}})
- 不包含
$nin
db.name.find({age:{$nin:[18,19,20]}})
- 包含:
- 正则表达式:
- 正则:
$regex
db.name.find({name:{$regex:'^c'}})
- 正则:
- 自定义查询:
- JS的执行环境:
$where:function(){return this.xxx;}
db.name.find({$where:function(){return this.age > 18;}})
- JS的执行环境:
- 比较运算符:
- limit/skip:
- 显示指定条数:
limit(x)
db.name.find().limit(x)
- 跳过指定条数:
skpi(x)
db.name.find().skip(x)
- 同时使用(分页):
.skip(x).limit(x)
db.name.find().skip(x).limit(y)
- 显示指定条数:
- 投影:
- 除_id外,0、1不能共存
0
:不想看的1
:仅想看的
- 不看xxx:
db.name.find({},{xxx:0})
- 仅看xxx:
db.name.find({},{xxx:1,_id:0})
- 除_id外,0、1不能共存
- 排序:
1
:升序db.name.find().sort({age:1})
-1
:降序db.name.find().sort({age:-1})
- 同时使用:
db.name.find().sort({name:-1},{age:1})
6.MongoDB的数据导入/导出:
- 导出数据:
mongoexport -d 数据库名 -c 集合名 -o 文件名 --type json/csv -f "字段名"
-d
:数据库名-c
:collection名-o
:输出的文件名--type
:输出的格式,默认为json-f
:输出的字段,如果--type为csv
,则需要加上-f "字段名"
- 例如:
mongoexport -d book -c yibutushu -o D:\mongodb\my_dbs_data\yibu_books_data.json --type json
- 导入数据:
mongoimport -d 数据库名 -c 集合名 --file 文件名 --headerline --type json/csv -f "字段名"
-d
:数据库名-c
:collection名--file
:要导入的文件--headerline
:如果导入的格式是csv,则可以使用第一行的标题作为导入的字段--type
:导入的格式默认json-f
:导入的字段名
- 例如:
mongoimport -d book -c taobao_book --file taobao_book_data.json --type json -f "book_name, book_price"
7.MongoDB的备份与恢复:
-
MongoDB数据库备份
mongodump -h dbhost -d dbname -o dbdirectory
-h
: MongDB所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017-d
: 需要备份的数据库实例,例如:test-o
: 备份的数据存放位置,例如:/home/mongodump/,当然该目录需要提前建立,这个目录里面存放该数据库实例的备份数据。
- 例如:
sudo rm -rf /home/momgodump/
sudo mkdir -p /home/momgodump
sudo mongodump -h 192.168.17.129:27017 -d itcast -o /home/mongodump/
-
MongoDB数据库恢复
mongorestore -h dbhost -d dbname --dir dbdirectory
-h
: MongoDB所在服务器地址-d
: 需要恢复的数据库实例,例如:test,当然这个名称也可以和备份时候的不一样,比如test2--dir
: 备份数据所在位置,例如:/home/mongodump/itcast/--drop
: 恢复的时候,先删除当前数据,然后恢复备份的数据。就是说,恢复后,备份后添加修改的数据都会被删除,慎用!
- 例如:
mongorestore -h 192.168.17.129:27017 -d itcast_restore --dir /home/mongodump/itcast/
MongoDB聚合管道
常用的管道命令:
- 聚合管道基本格式:
db.集合.aggregate({管道:{表达式}})
$group
:- 将集合中的文档分组,可用于统计结果
- 常用表达式:
$sum
:- 计算总合
$avg
:- 计算平均值
$min
:- 获取最小值
$max
:- 获取最大值
$push
:- 在结果文档中插入值到一个数组中
- 例如:
db.stu.aggregate({$group:{_id:"$sex",sum_age:{$sum:1},avg_age:{$avg:"$age"},name_list:{$push:"$name"}}})
$match
:- 过滤数据,只输出符合条件的文档
- 例如:
db.stu.aggregate({$match:{name:/a/}},{$group:{_id:"$age",name:{$push:"$name"}}})
- 例如:
- 过滤数据,只输出符合条件的文档
$project
:- 修改输入文档的结构,如:重命名、增加、删除字段、创建计算结果
- 例如:
db.stu.aggregate({$group:{_id:"$sex",counter:{$sum:1}}},{$project:{_id:0,counter:1}})
- 例如:
- 修改输入文档的结构,如:重命名、增加、删除字段、创建计算结果
$sort
:- 将输入文档排序后输出,1升序,-1降序
- 例如:
db.stu.aggregate({$sort:{age:-1,sex:1}})
- 例如:
- 将输入文档排序后输出,1升序,-1降序
$limit
和$skip
:$limit
限制聚合管道返回的文档数$skip
跳过指定数量的文档,并返回余下的文档- 同时使用时先使用
$skip
再$limit
- 例如:
db.stu.aggregate({$skip:1},{$limit:2})
- 同时使用时先使用
$unwind
:- 拆分字段,将指定字段的列表拆分为单个值显示出来
- 例如:
db.stu.aggregate({$unwind:{path:"需要拆分的字段",preserveNullAndEmptyArrays:true}})
- 例如:
- 拆分字段,将指定字段的列表拆分为单个值显示出来
MongoDB索引
1.索引介绍:
- 加快查询速度,进行数据的去重
- 采用排序二叉树的方法进行查询
- 创建索引:
db.集合名.ensureIndex({字段名:1})
- 1为升序,-1为降序
- 例如:
db.nums.ensureIndex({name:1})
- 删除索引:
db.集合名.dropIndex({索引名:1})
- 例如:
db.nums.dropIndex({name_1:1})
db.nums.dropIndex('name_1')
- 例如:
2.唯一索引:
- 保证数据的唯一性,对数据去重
- 创建方法:
db.集合名.ensureIndex({字段名:1},{unique:true})
- 根据唯一索引指定字段的值,如过相同,则无法插入
- 例如:
db.nums.ensureIndex({"name":1},{"unique":true})
3.复合索引:
- 创建方法:
db.集合名.ensureIndex({字段1:1,字段2:1})
- 在数据去重时,用一个域来保证数据的唯一性
4.注意点:
- 升序和降序在单个索引不影响查询速度,但复合索引会影响
- 经常进行写入操作时,创建索引会影响写入速度
- 经常频繁查询,并且还需频繁写入时,可以采用读写分离
- 创建两个集合,一个写、一个查,定期把写集合的数据同步到查集合中
MongoDB权限管理
1.管理员账户:
- 使用admin数据库,管理员账号必须创建在该数据库上
use admin
- 创建超级用户
db.createUser({user:"xxx",pwd:"xxx",roles:["root"]})
- 以权限认证方式启动
mongod --auth
- 管理员登陆认证
db.auth('用户名','密码')
2.普通用户:
- 创建普通用户
db.createUser({user:"xxx",pwd:"xxx",roles:["权限"]})
- 读权限:
read
- 读写权限:
readWrite
- 读权限:
- 在admin数据库里,添加其他数据库的普通用户
db.creareUser({user:"xxx",pwd:"xxx",roles:[{db:"数据库1",role:"权限"},{db:"数据库2",role:"权限"}]})
- 用户登陆认证,在那个数据库创建的用户,就在那个数据库上登陆
db.auth('用户名','密码')
- 删除普通用户
db.dropUser("用户名")