翼度科技»论坛 编程开发 mysql 查看内容

MongoDB基础

10

主题

10

帖子

30

积分

新手上路

Rank: 1

积分
30
优质博客网站:IT-BLOG-CN
一、简介

MongoDB是一个强大的分布式文件存储的NoSQL数据库,天然支持高可用、分布式和灵活设计。由C++编写,运行稳定,性能高。为WEB应用提供可扩展的高性能数据存储解决方案。主要解决关系型数据库数据量大,并发高导致查询效率低下的问题,通过使用内存代替磁盘提高查询性能。
MongoDB特点:
【1】模块自由:可以把不同结构的文档存在在同一个数据库里;
【2】面向集合的存储:适合存储JSON风格文件的形式;
【3】完整的索引支持:对任何属性都可以加索引;
【4】复制和高可用性:支持服务器之间的数据复制,支持主-从模式及服务器之间的相互复制。从而提供冗余备份及自动故障转移;
【5】自动分片:支持云级别的伸缩性,自动分片功能支持水平的数据库集群,可动态添加额外的机器;
【6】丰富的查询:支持丰富的查询表达方式,查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组;
【7】快速更新查询:查询优化器会分析查询表示式,并生成一个高效的查询计划;
【8】高效的传统存储方式:支持二进制数据及大型对象(如图片);
二、基本操作

MongoDB将数据存储在一个文件,数据结构由键值key:value对组成,类似于JSON对象,字段值包含其他文档、数组、文档数组。
SQL术语MongoDB术语说明DataBaseDataBase数据库TableCollection数据库表/集合:存储多个文档,结构不固定{'name':'zzx','gender':'男'}{'class':'一班','count':'10'}RowDocument数据记录行/文档就是一个对象,由键值对构成,是JSON扩展的BSON格式{'name':'zzx','gender':'男'}ColumnField数据字段/域IndexIndex索引Table Joins表连接,MongoDB不支持Primary KeyPrimary Key主键,MongoDB自动将_id设置为主键集合操作
  1. // 创建
  2. db.createCollection(name, options)
  3. // 查看集合
  4. show collections
  5. // 删除
  6. db.集合名称.drop()
复制代码
name要创建的集合名称,options是一个文档,用于制定集合的配置,选项参数是可选的:参数capped:默认为false表示不设置上限;参数size:当capped值为true时,需要指定此参数,表示设置上限的大小,会覆盖之前的值,单位为字节。
  1. db.createCollection("stu")
  2. db.createCollection("stu", { capped: true, size: 20})
复制代码
数据类型

类型说明Object ID文档ID,每个文档都有一个属性,为_id保证一个文档的唯一性,可以自己设置,如果没有设置自动提供一个特别的_id,类型为objectID:12字节的十六进制数,前4个字节时时间戳,接下来3个字节是机器ID,接下来2个字节服务进程ID最后三位是增量值String字符串UTF-8Boolean布尔Integer整形Double布尔Arrays数组或列表Object嵌入式的文档,MongoDB是不能维护关系的,可以通过嵌入文档的形式来维护这个关系Null空值Timestamp时间戳Date日期UNIX时间格式文档操作
  1. // 插入
  2. db.集合名称.insert(document)
  3. //案例1
  4. db.stu.insert({name:'zzx',gender:1}) //自动生成_id
  5. //案例2
  6. s1={_id:'43444433',name:'zzx'}
  7. s1.gender=0
  8. db.stu.insert(s1)
  9. // 修改
  10. db.集合名称.update(
  11.     <query>, // 查询条件,类似sql中的where部分
  12.     <update>,  // 类似sql中的 set部分
  13.     {$multi:<boolean>} // 默认false值改第一条记录,true表示修改满足的所有数据
  14. )
  15. //案例
  16. db.stu.update({name:'zzx'},{name:'fj'}) // 整个文档的结构都会发生变化
  17. db.stu.update({name:'zzx'},{$set:{name:'fj'}}) // 只会修改 name的属性
  18. // 保存:如果数据存在进行修改,不存在进行插入
  19. db.集合名称.save(document)
  20. // 删除
  21. db.集合名称.remove(
  22.     <query>,
  23.     {
  24.         justOne:<boolean> //默认false会删除多条
  25.     }
  26. )
复制代码
查询操作
  1. // 查询
  2. db.集合名称.find(条件文档)
  3. // 查询一条数据
  4. db.集合名称.findOne(条件文档)
  5. //案例 and和or一起使用。运算法符:$lt小于 $lte小于等于 $gt大于 $gte大于等于 $ne不等于 使用//或者$regex编写正则表达式
  6. db.stu.find({$or:[{age: {$gte: 18}}, {gender: 1}], name: 'zzx'})
  7. db.stu.find({name:{$regex:'^黄'}})
  8. db.stu.find({name:/^黄/})
  9. // ** 自定义查询:使用 $where后面写一个函数
  10. db.stu.find({$where:function(){return this.age > 20}})
  11. // limit()用于读取指定数量的文档
  12. db.集合名称.find().limit(NUMBER) //NUMBER表示文档的条数
  13. // skip()用于跳过指定数量的文件,配合limit实现分页功能,与limit同时使用的时候不分先后顺序。
  14. db.集合名称.find().skip(NUMBER)
  15. //投影:查询的结构集只选择必要的字段
  16. db.集合名称.find({},{字段名称:1,...}) // 对需要显示的字段设置为1,id默认会返回,如果不想返回可以设置为0
  17. // 排序 sort()
  18. db.集合名称.find().sort({字段:1,...}) // 1升序,-1降序
  19. // 统计 count()
  20. db.集合名称.find().count({条件}) //find可以省略
  21. db.stu.count({age:{$gt:20},gender:1})
  22. // 去重distinct()
  23. db.集合名称.distinct({去重字段,{条件}})
复制代码
聚合

主要用于计算数据,类似sql中的sum()、avg()。
常用的管道:$group将集合中的文档分组,可用于统计结果;$match过滤数据,只输出符合条件的文档;$project修改输入文档的结构,如重命名、增加、删除字段、创建计算结果;$sort将输入文档排序后输出;$limit限制聚合管道返回的文档数;$skip跳过指定数量的文档,返回剩余文档;$unwind将数组类型的字段进行拆分;
常用的表达式:$sum计算综合,$sum:1同count表示计数;$avg计算平均值;$min获取最小值;$max获取最大值;$push在结果文档中插入值到下一个数组中;$first根据资源文件的排序获取第一个文档数据;$last根据资源文档的排序获取最后一个文档数据。
  1. db.集合名称.aggregate([{管道:{表达式}}]) //管道在Linux中一般用于将当前命令的输出结果作为下一个命令的输入,在MongoDB中是同样的作用
复制代码
分组$group
  1. // 统计男女的总人数 _id表示组分的依据,使用某个字段的格式为'$字段',如果需要得到整个文档可以使用 '$$ROOT' 替换 '$age'
  2. db.stu.aggregate([
  3.     {$group:{
  4.         _id:'$gender',
  5.         counter:{$push:'$age'}
  6.     }}
  7. ])
  8. // 输入
  9. {"_id":男,"counter":[12,45]}
  10. {"_id":女,"counter":[22,15]}
复制代码
过滤数据$match
  1. db.stu.aggregate([
  2.     {$match:{age:{$gt:20}}},
  3.     {$group:{_id:'$gender',counter:{$sum:1}}}
  4. ])
复制代码
投影$project:只显示某个字段
  1. db.stu.aggregate([
  2.     {$group:{_id:'$gender',counter:{$sum:1}}},
  3.     {$project:{_id:0,counter:1}}
  4. ])
复制代码
排序$sort
  1. db.stu.aggregate([
  2.     {$group:{_id:'$gender',counter:{$sum:1}}},
  3.     {$sort:{counter:-1}}
  4. ])
复制代码
$limit 和 $skip
  1. db.stu.aggregate([
  2.     {$group:{_id:'$gender',counter:{$sum:1}}},
  3.     {$sort:{counter:-1}},
  4.     {$skip:1},
  5.     {$limit:1}
  6. ])
复制代码
$unwind 将数组类型的字段进行拆分,如果不是数组是一个属性,就单独输出该属性
  1. db.集合名称.aggregate([{$unwind:'$字段名称'}])
  2. db.stu.insert({name:'zzx',size:['S','Z','L']})
  3. db.stu.aggregate([
  4.     $unwind:'$size'
  5. ])
  6. // 处理是空数组,无字段,null的情况使用上述 $unwind数据会丢失,可以使用下面表达式,防止数据丢失
  7. db.stu.aggregate([
  8.     {$unwind:{
  9.         path:'$字段名称',
  10.         preserverNullAndEmptyArrays:<boolean> //防止数据丢失
  11.     }}
  12. ])
复制代码
三、索引

MongoDB通过索引提升查询速度
  1. // 使用explain()命令分析查询性能
  2. db.stu.find({name:'zzx100000'}).explain('executionStats')
  3. // 分析结果如下:
  4. "executionStats": {
  5.     "executionSuccess": true,
  6.     "nReturned": 1,
  7.     "executionTimeMillis": 96,
  8.     "totalKeysExamined": 0,
  9.     "totalDocsExamined": 100000,
  10. }
复制代码
建立索引: 1表示升序,-1表示降序
  1. db.集合.ensureIndex({属性:1})
  2. db.stu.ensureIndex({name:1})
  3. // 对索引属性查询
  4. db.stu.find({name:'zzx100000'}).explain('executionStats')
  5. // 分析结果如下:
  6. "executionStats": {
  7.     "executionSuccess": true,
  8.     "nReturned": 1,
  9.     "executionTimeMillis": 1,
  10.     "totalKeysExamined": 0,
  11.     "totalDocsExamined": 100000,
  12. }
  13. // 唯一索引
  14. db.stu.ensureIndex({'name':1},{'unique':true})
  15. // 联合索引
  16. db.stu.ensureIndex({name:1,age1})
  17. // 查看索引
  18. db.stu.getIndexes()
  19. // 删除所以
  20. db.stu.dropIndexes('索引名称')
复制代码
四、安全

为了更安全的访问MongoDB,需要创建用户。采用角色、用户、数据库的安全管理方式。常用的角色如下:root只在admin数据库中可用,超级账号,超级权限。Read用户只读权限,readWrite用户读写权限。
  1. // 创建超级管理员
  2. use admin // admin是数据库
  3. db.createUser({
  4.     user:'admin',
  5.     pwd:'123',
  6.     roles:[{role:'root',db:'admin'}]
  7. })
复制代码
启用安全认证:修改配置文件
  1. sudo vi /etc/mongod.conf
复制代码
启用身份认证:keys and values之间一定要有空格,否则解析错误。修改完配置文件后,必须重启服务。
  1. security:
  2.     authorization: enable
复制代码
数据库连接
  1. mongo -u admin -p 123 --authenticationDatabase admin
复制代码
五、备份与恢复

复制提供数据冗余备份,并在多个服务器上存储数据副本,提高数据的可用性,并保证数据的安全性,允许从硬件故障和服务中断中恢复数据。常见的搭配是一主多从。主节点记录所有操作,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证数据的一致性。
优点:
【1】数据备份;
【2】数据灾难恢复(自动故障转移,自动恢复);
【3】读写分离;
【4】高数据可用;
【5】无宕机维护;
【6】副本集对应用程序是透明的;
设置复制节点:
  1. mongod --bind_ip 192.168.113.122 --port 27017 --dbpath ./mongdb/file1 --replSet rs0 // rs0副本集,master和slave的副本集相同
  2. mongod --bind_ip 192.168.154.132 --port 27017 --dbpath ./mongdb/file1 --replSet rs0
复制代码
通过客户端连接MongoDB master,并在master上面进行初始化,同时添加其他副本集(也就是备份的服务器信息)。如果在从服务器上进行读操作,需要设置rs.slaveOk()。
  1. mongo --host 192.168.113.122 --port 27017 // 主服务器
  2. rs.initiate()  //rs是mongodb提供的副本集管理对象
  3. rs.add('192.168.154.132:27017') // 从服务器
  4. rs.salveOk()
复制代码
手动备份:
  1. mongodump -h dbhost -d dbname -o dbdirectory
复制代码
恢复:
  1. mongorestore -h dbhost -d dbname --dir dbdirectory
复制代码
来源:https://www.cnblogs.com/zhengzhaoxiang/p/17245873.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具