MongoDB数据库详细讲解

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-8
    • Boolean:布尔值,true/false
    • Integer:整数
    • Double:浮点数
    • Arrays:数组/列表
    • Object:一条数据/文档,即文档嵌套文档
    • Null:空
    • Timestamp:时间戳
    • Date:日期/时间
  • 注意点:
    • 每个文档都有一个不同的属性(_id),保证每个文档的唯一性
      • 可手动设置_id的值,没有手动设置则会自动提供一个独特的_id,类型为objectID
    • objectID是一个12字节的十六进制数,每个字节两位,一共是24位的字符串:
      • 前4个字节(8位)为时间戳
      • 接下来的3个(6位)是机器ID
      • 再然后2个(4位)是MongoDB服务进程ID
      • 最后3个(6位)是简单的增量值

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;}})
    • 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})
    • 排序:
      • 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}})
  • $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("用户名")
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值