mongodb
2022-02-22 17:40:02 2 举报
AI智能生成
登录查看完整内容
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
show users
设置密码
db.shutdownServer()
停服务
exit
退出
mongo -u wangwei
授权模式连接
客户端使用
安全说明
help
查看命令
db
显示当前所在的库
use example
切换数据库
db.集合.insertOne(<json对象>)
db.集合.insert()
添加单个文档
批量添加文档
db.集合.insert(doc,{writeConcern:安全级别})
安全写
是否顺序写
复合主键
添加文档
db.userinfo.find()
查询所有文档
db.userinfo.find().pretty()
返回格式化文档
查看文档
skip和limit不起作用
db.movies.find().skip(1).limit(1).count()
skip和limit起作用
db.movies.find().skip(1).limit(1).count(true)
文档游标
db.userinfo.find({age:18})
精准等值查询
多条件查询
db.inventory.find( { "size.uom": "in" } )
嵌套对象精准查询
返回指定字段
作用在不用字段,可以省略$and
条件查询and
条件查询or
db.members.find({points: { $not: { $lt: 100}}} );
条件查询not
{a:{$ne:1}}
a<>1 或者a!=1
{a:{$gt:1}}
a>1
a<=1
{a:{$lt:1}}
a<1
{a:{$lte:1}}
in
not in
{a:{$exists:false}}
a is null
mongo查询条件和SQL对照表
db.movies.find().sort({year:1}).pretty()
正序
db.movies.find().sort({year:-1}).pretty()
倒序
排序----sort
投影设置
返回数组第一个元素
返回数组倒数第一个元素
数组中间截取
返回数据的部分元素----$slice
数组元素匹配----$elemMatch
条件查询
1 表示由小到大, -1 表示逆向排序当同时应用 sort, skip, limit 时 ,应用的顺序为 sort, skip, limit
{ field: < 1 :1 表示需要返回, 0: 表示不需要返回 , 只能为 0,或者1 , 非主键字段,不能同时混选0 或 1>}
分布式环境下,count不保证数据的绝对正确
将tag 中有90 的文档,增加一个字段: flag: 1
更新特定字段
$set 更新或新增字段
$unset删除字段
$rename 重命名字段
$inc 加减字段值
$mul 相乘字段值
$min 采用最小值
$max 次用最大值
更新操作符
更新文档
删除文档
db.collection.drop( { writeConcern:<doc>})
删除集合
命令
② 基本使用
加两个字段totalPrice,totalCost
对数组awards的字段wins和 nominations 求和
对totalPrice进行排序
-1:倒序 1:正序
$<field> : 用$指示字段路径
$<filed>.<sub filed> : 使用$和.来指示内嵌文档的路径
获取字段信息
$literal :<value> : 指示常量 <value>
常量表达式
$$<variable> 使用 $$ 指示系统变量
系统变量表达式
聚合表达式
db.userInfo.aggregate({$project:{ name : "$nickName"}});
将集合中的nickName投影成name
灵活控制输出文档的格式,可以剔除不需要的字段
$project 对输入文档进行再次投影
db.userInfo.aggregate({$match:{nickName:"lisi"}})
先筛选再投影
$match 对输入文档进行筛选
db.userInfo.aggregate({$limit:1});
$limit 筛选出管道内前 N 篇文档
db.userInfo.aggregate({$skip:1});
$skip 跳过管道内前N篇文档
db.userInfo.aggregate({$unwind : {path:"$tags"}});
includeArrayIndex: 加上数组元素的索引值, 赋值给后面指定的字段
preserveNullAndEmptyArrays:true展开时保留空数组,或者不存在数组字段的文档
$unwind 展开输入文档中的数组字段
db.userInfo.aggregate({$sort:{age:-1}})
$sort 对文档进行排序: 1 正序, -1 倒序
$sort 对输入文档进行排序
$lookup 对输入文档进行查询操作
$addToSet :将分组中的元素添加到一个数组中,并且自动去重
$avg 返回分组中的平均值, 非数值直接忽略
$first 返回分组中的第一个元素
$last 返回分组中的最后一个元素
$max 返回分组中的最大元素
$min 回分组中的最小元素
$push 创建新的数组,将值添加进去
$sum 求分组数值元素和
group 阶段有 100m内存的使用限制, 默认情况下,如果超过这个限制会直接返回 error,可以通过设置 allowDiskUse 为 true 来避免异常, allowDiskUse 为 true 将利用临时文件来辅助实现group操作。
$group 对输入文档进行分组
$out 对管道中的文档输出
https://docs.mongodb.com/manual/reference/operator/aggregation-pipeline/
更多聚合操作参考
聚合管道阶段
聚合管道可以确定它是否仅需要文档中的字段的子集来获得结果。如果是这样,管道将只使用那些必需的字段,减少通过管道的数据量
投影优化
对于包含投影阶段($project或$unset或$addFields或$set)后跟$match阶段的聚合管道,MongoDB 将$match阶段中不需要在投影阶段计算的值的任何过滤器移动到投影前的新$match阶段
管道符号执行顺序优化
如果序列中带有$sort后跟$match,则$match会移动到$sort之前,以最大程度的减少要排序的对象的数量
$sort + $match
当有一个$project或$unset之后跟有$skip序列时,$skip 会移至$project之前。
$project/ $unset + $skip序列优化
当$limit紧接着另一个时 $limit,两个阶段可以合并为一个阶段 $limit,其中限制量为两个初始限制量中的较小者。
$limit+ $limit合并
当$skip紧跟另一个$skip,这两个阶段可合并成一个单一的$skip,其中跳过量为总和的两个初始跳过量。
skip+ $skip 合并
当一个$match紧随另一个紧随其后时 $match,这两个阶段可以合并为一个单独 $match的条件 $and
$match+ $match合并
管道优化
③ 聚合操作
B+ tree
默认id索引
db.members.createIndex({name:1})
db.members.createIndex({name:1},{ name: "whatever u like."});
单键索引
复合索引
db.members.createIndex({tags:1})
多键索引
创建索引
db.members.getIndexes();
查询索引
db.members.explain().find({name:1})
COLLSCAN: 整个集合扫描
IXScan: 索引扫描
FETCH: 根据索引指向的文档的地址进行查询
SORT: 需要再内存中排序,效率不高
winningPlan-->stage
效果解析
覆盖查询
如果需要更改某些字段上已经创建的索引,必须首先删除原有索引,再重新创建新索引,否则,新索引不会包含原有文档
更改索引
db.members.dropIndex("name_1")
使用索引名称删除索引
db.members.dropIndex({tags:1})
使用索引定义删除索引
删除索引
如果哪些文档没有name,那么这些文档就不会被索引
索引的唯一性
索引的稀疏性
在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参数)有则参与投票
隐藏(hidden参数):复制数据,但对应用不可见。隐藏节点可以具有投票权,但优先级必须为0
延迟(slaveDelay参数):复制 n 秒之前的数据,保持与主节点的时间差
从节点不建立索引( buildIndexes)
复制集节点的选配项
https://note.youdao.com/noteshare?id=f42ca06d983dd456e9d158bcbb025477
搭建复制集和分片集群,整合springBoot
⑤ 复制集
mongodb
DB
0 条评论
回复 删除
下一页