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 条评论
下一页
为你推荐
查看更多