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}]})
- 简洁格式:
- 或关系:
$ordb.name.find({$or:[{age:{$gt:18},sex:true}]})
- 与关系:
- 范围运算符:
- 包含:
$indb.name.find({age:{$in:[18,19,20]}})
- 不包含
$nindb.name.find({age:{$nin:[18,19,20]}})
- 包含:
- 正则表达式:
- 正则:
$regexdb.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/momgodumpsudo 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("用户名")
本文详细介绍了MongoDB的安装、启动、客户端使用、数据库和集合的操作,包括数据类型、增删改查语法。还涵盖了MongoDB的数据导入导出、备份恢复、聚合管道、索引管理和权限管理。深入讲解了如何通过索引提升查询效率,创建唯一索引以确保数据唯一性,以及如何利用聚合管道进行复杂数据处理。同时,文章提及了权限管理,包括管理员和普通用户的创建与管理。
970

被折叠的 条评论
为什么被折叠?



