mongodb
2022-02-22 17:40:02   2  举报             
     
         
 AI智能生成
  mongodb详解
    作者其他创作
 大纲/内容
  mongodb    
     ① 安装    
     官方地址    
     https://www.mongodb.com/  
     获取安装包    
     wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-5.0.5.tgz  
     解压    
     tar -xvzf mongodb-linux-x86_64-rhel70-5.0.5.tgz  
     添加到系统路径    
     vim ~/.bashrc       export PATH=$PATH:/usr/local/softs/mongodb/mongodb-linux-x86_64-rhel70-5.0.5/bin  
     source ~/.bashrc  
     创建数据目录    
     mkdir -p /data/db/mongodb  
     后台启动    
     mongod --logpath /data/db/mongodb/logpath/output.log  --fork  
     授权模式启动    
     mongod --auth  
     ② 基本使用    
     客户端使用    
     连接    
     mongo --host 127.0.0.1 --port  27017  
     设置密码    
     use admin  
     db.createUser({user:"wangwei",pwd:"552020",roles:["root"]});  
     show users  
     停服务    
     db.shutdownServer()  
     退出    
     exit  
     授权模式连接    
     mongo -u wangwei  
     安全说明  
     命令    
     查看命令    
     help  
     显示当前所在的库    
     db  
     切换数据库    
     use example  
     添加文档    
     添加单个文档    
     db.集合.insertOne(<json对象>)  
     db.集合.insert()  
     批量添加文档    
     db.userinfo.insertMany([{name:"wangwei",age:19},{name:"zhangsan",age:90}])  
     安全写    
     db.集合.insert(doc,{writeConcern:安全级别})  
     是否顺序写    
     db.集合.insert(doc,{writeConcern:安全级别,ordered:true/false})  
     复合主键  
     查看文档    
     查看文档    
     查询所有文档    
     db.userinfo.find()  
     返回格式化文档    
     db.userinfo.find().pretty()  
     条件查询    
     文档游标    
     db.movies.find().skip(1).limit(1).count()    
     skip和limit不起作用  
     db.movies.find().skip(1).limit(1).count(true)    
     skip和limit起作用  
     精准等值查询    
     db.userinfo.find({age:18})  
     多条件查询    
     db.userinfo.find({name:"wangwei",age:19})  
     嵌套对象精准查询    
     db.inventory.find( { "size.uom": "in" } )  
     返回指定字段    
     db.movies.find({},{year:1})  
     条件查询and    
     db.movies.find({$and:[{year:1942},{"rated":"PG"}]}).pretty();  
     db.movies.find({$and:[{year:{$eq:1942}},{"rated":{$eq:"PG"}}]}).pretty();    
     作用在不用字段,可以省略$and  
     条件查询or    
     db.movies.find({$or:[{year:1942},{"rated":"PG"}]}).pretty()  
     db.movies.find({$or:[{year:{$gt:1942}},{"rated":{$eq:"PG"}}]}).pretty()  
     条件查询not    
     db.members.find({points: { $not: { $lt: 100}}} );  
     mongo查询条件和SQL对照表    
     a<>1 或者a!=1    
     {a:{$ne:1}}  
     a>1    
     {a:{$gt:1}}  
     a<=1    
     {a:{$gt:1}}  
     a<1    
     {a:{$lt:1}}  
     a<=1    
     {a:{$lte:1}}  
     in    
     {a:{$in:[x,y,z]}}  
     not in    
     {a:{$nin:[x,y,z]}}  
     a is null    
     {a:{$exists:false}}  
     排序----sort    
     正序    
     db.movies.find().sort({year:1}).pretty()  
     倒序    
     db.movies.find().sort({year:-1}).pretty()  
     投影设置    
     db.members.find({},{_id:0 ,nickName:1, points:1})  
     db.members.find({},{_id:0 ,nickName:1, points:0})  
     返回数据的部分元素----$slice    
     返回数组第一个元素    
     db.movies.find({},{_id:0,year:1,rated:1,cast:{$slice:1}}).pretty()  
     返回数组倒数第一个元素    
     db.movies.find({},{_id:0,year:1,rated:1,cast:{$slice:-1}}).pretty()  
     数组中间截取    
     db.movies.find({},{_id:0,year:1,rated:1,cast:{$slice:[0,1]}}).pretty()  
     db.movies.find({},{_id:0,year:1,rated:1,cast:{$slice:[1,6]}}).pretty()  
     数组元素匹配----$elemMatch    
     db.movies.find({},{_id:0,year:1,rated:1,cast:{$elemMatch:{$eq:"Miyu Irino"}}}).pretty()  
     更新文档    
     db.collection.update( <query>,<update>,<options>)  
     将tag 中有90 的文档,增加一个字段: flag: 1    
     db.userInfo.updateMany( {tag:"90"},{$set{flag:1}}
);  
     db.userInfo.updateOne( {tag:"90"},{$set{flag:1}}
);  
     更新特定字段  
     更新操作符    
     $set 更新或新增字段  
     $unset删除字段  
     $rename 重命名字段  
     $inc 加减字段值  
     $mul 相乘字段值  
     $min  采用最小值   
     $max  次用最大值  
     删除文档    
     删除文档    
     db.collection.remove(<query>,<options>)  
     删除集合    
     db.collection.drop( { writeConcern:<doc>})  
     ③ 聚合操作    
     db.movies.aggregate([{$addFields:{totalPrice:{$sum:"$awards.wins"},totalCost:{$sum:"$awards.nominations"}}}])    
     加两个字段totalPrice,totalCost  
     对数组awards的字段wins和 nominations  求和  
     db.movies.aggregate([{$addFields:{totalPrice:{$sum:"$awards.wins"},totalCost:{$sum:"$awards.nominations"}}},{$sort:{totalPrice:-1}}])    
     对totalPrice进行排序  
     -1:倒序   1:正序  
     聚合表达式    
     获取字段信息    
     $<field> : 用$指示字段路径  
     $<filed>.<sub filed> : 使用$和.来指示内嵌文档的路径  
     常量表达式    
     $literal :<value> : 指示常量 <value>  
     系统变量表达式    
     $$<variable>  使用 $$ 指示系统变量  
     聚合管道阶段    
     $project  对输入文档进行再次投影    
     将集合中的nickName投影成name    
     db.userInfo.aggregate({$project:{ name : "$nickName"}});  
     灵活控制输出文档的格式,可以剔除不需要的字段    
     db.userInfo.aggregate({$project:{ name : "$nickName",_id:0,age:1}})  
     $match 对输入文档进行筛选    
     db.userInfo.aggregate({$match:{nickName:"lisi"}})  
     db.userInfo.aggregate([{$match:{nickName:"lisi"}},{$project:{_id:0,name:"$nickName",age:1}}])    
     先筛选再投影  
     $limit 筛选出管道内前 N 篇文档    
     db.userInfo.aggregate({$limit:1});  
     $skip 跳过管道内前N篇文档    
     db.userInfo.aggregate({$skip:1});  
     $unwind 展开输入文档中的数组字段    
     db.userInfo.aggregate({$unwind : {path:"$tags"}});  
     db.userInfo.aggregate({$unwind : {path:"$tags",includeArrayIndex:"arrIndex"}});    
      includeArrayIndex:  加上数组元素的索引值, 赋值给后面指定的字段  
     db.userInfo.aggregate({$unwind : {path:"$tags",includeArrayIndex:"arrIndex",preserveNullAndEmptyArrays:true}});    
     preserveNullAndEmptyArrays:true
展开时保留空数组,或者不存在数组字段的文档  
     $sort 对输入文档进行排序    
     db.userInfo.aggregate({$sort:{age:-1}})  
     $sort  对文档进行排序: 1 正序, -1 倒序  
     $lookup 对输入文档进行查询操作    
     db.accountDetail.aggregate({ $lookup :   {from:"account",localField:"aid",foreignField:"_id",as:"field1"  }  });  
     $group 对输入文档进行分组    
     $addToSet :将分组中的元素添加到一个数组中,并且自动去重    
     db.sales.aggregate([{$group:{_id:{day:{$dayOfYear:"$date"},year:{$year:"$date"} },itemsSold:{$addToSet:"$item"}  }  }])  
     $avg   返回分组中的平均值, 非数值直接忽略    
     db.sales.aggregate([{$group: {_id:"$item",avgAmount:{$avg:{$multiply:["$price","$quantity"]}},avgQuantity:{$avg:"$quantity"} } }]);  
     $first   返回分组中的第一个元素  
     $last    返回分组中的最后一个元素  
     $max  返回分组中的最大元素  
     $min  回分组中的最小元素  
     $push   创建新的数组,将值添加进去  
     $sum    求分组数值元素和  
     group 阶段有 100m内存的使用限制, 默认情况下,如果超过这个限制会直接返回 error,可以通过设置  allowDiskUse 为 true 来避免异常, allowDiskUse 为 true 将利用临时文件来辅助实现
group操作。  
     $out 对管道中的文档输出  
     更多聚合操作参考    
      https://docs.mongodb.com/manual/reference/operator/aggregation-
pipeline/  
     管道优化    
     投影优化    
     聚合管道可以确定它是否仅需要文档中的字段的子集来获得结果。如果是这样,管道将只使用那些必需的
字段,减少通过管道的数据量  
     管道符号执行顺序优化    
     对于包含投影阶段($project或$unset或$addFields或$set)后跟$match阶段的聚合管道,MongoDB 将
$match阶段中不需要在投影阶段计算的值的任何过滤器移动到投影前的新$match阶段  
     $sort +  $match    
     如果序列中带有$sort后跟$match,则$match会移动到$sort之前,以最大程度的减少要排序的对象的数
量  
     $project/ $unset + $skip序列优化    
     当有一个$project或$unset之后跟有$skip序列时,$skip 会移至$project之前。  
     $limit+ $limit合并    
     当$limit紧接着另一个时 $limit,两个阶段可以合并为一个阶段 $limit,其中限制量为两个初始限制量中的
较小者。  
     skip+ $skip 合并    
     当$skip紧跟另一个$skip,这两个阶段可合并成一个单一的$skip,其中跳过量为总和的两个初始跳过量。  
     $match+ $match合并    
     当一个$match紧随另一个紧随其后时 $match,这两个阶段可以合并为一个单独 $match的条件 $and  
     ④ 索引    
     B+ tree  
     默认id索引  
     创建索引    
     单键索引    
     db.members.createIndex({name:1})  
     db.members.createIndex({name:1},{ name: "whatever u like."});  
     复合索引    
     db.members.createIndex({name:1,age:-1})  
     多键索引    
     db.members.createIndex({tags:1})  
     查询索引    
     db.members.getIndexes();  
     效果解析    
     db.members.explain().find({name:1})  
     winningPlan-->stage    
     COLLSCAN:  整个集合扫描  
     IXScan: 索引扫描  
     FETCH:  根据索引指向的文档的地址进行查询  
     SORT: 需要再内存中排序,效率不高  
     覆盖查询    
     db.members.explain().find({name:"zhangsan"},{_id:0,name:1})    
     这时不需要 fetch, 可以直接从索引中获取数据。  
     更改索引    
     如果需要更改某些字段上已经创建的索引,必须首先删除原有索引,再重新创建新索引,否则,新索引不
会包含原有文档  
     删除索引    
     使用索引名称删除索引    
     db.members.dropIndex("name_1")  
     使用索引定义删除索引    
     db.members.dropIndex({tags:1})  
     索引的唯一性    
     db.members.createIndex({name:1},{unique:true})    
     如果哪些文档没有name,那么这些文档就不会被索引  
     索引的稀疏性    
     db.sparsedemo.createIndex({name:1},{sparse:true});  
     索引的过期时间    
     db.members.createIndex({ create_time: 1},{expireAfterSeconds:30 });    
     在create_time上创建了一个30s过期的索引  
     参考文档    
     https://docs.mongodb.com/manual/core/index-compound/#index-ascending-and-descending  
     https://docs.mongodb.com/manual/reference/operator/aggregation/addFields/#pipe._S_addFields  
     ⑤ 复制集    
     主要意义-实现服务高可用,类似于redis的哨兵模式    
     数据分发:将数据从一个区域复制到另一个区域,减少另一个区域的读延迟  
     读写分离:不同类型的压力分别在不同的节点上执行  
     异地容灾:在数据中心故障时快速切换到异地  
     功能    
     数据写入主节点时将数据复制到另一个副本节点上  
     主节点发生故障时自动选举出一个新的替代节点  
     主从数据如何复制  
     通过选举完成故障恢复    
     影响选举因素    
     整个集群必须有大多数节点存活  
     被选举为主节点的节点必须    
     1.能够与多数节点建立连接  
     2.具有较新的oplog  
     3.具有较高的优先级(如果有配置)  
     复制集节点的选配项    
     是否具有投票权(v参数)有则参与投票  
     优先级(priority参数):优先级越高的节点越优先成为主节点。优先级为0的节点无法成为主节
点,默认值为1。  
     隐藏(hidden参数):复制数据,但对应用不可见。隐藏节点可以具有投票权,但优先级必须为
0  
     延迟(slaveDelay参数):复制 n 秒之前的数据,保持与主节点的时间差  
     从节点不建立索引( buildIndexes)  
     搭建复制集和分片集群,整合springBoot    
     https://note.youdao.com/noteshare?id=f42ca06d983dd456e9d158bcbb025477  
    
 
 
 
 
  0 条评论
 下一页
  
   
   
   
   
  
  
  
  
  
  
  
  
  
  
 