2023/5/15之前关于MongoDB的学习实践
库、集合、文档(最大16M)的CRUD:
show dbs/collections/tables;
use 库 创建库
db.dropDatabase(); 删除库
db.createCollections(''); 创建集合
固定集合:.createCollections(库名,{capped:true,size:10000,[max:xx]}) 可以用库名.capped()判断是否是固定集合
db.集合.drop(); 删除集合
db.集合.insertOne/Many 集合中插入数据
关系:在文档中插入时类似于引入外键,分为嵌入式关系 / 引入式关系
嵌入式就是将本应存在的另一个集合中的数据插入到相关联的集合的文档中,而引入式就是在相关联文档中插入一个关联(看后面的引用概念)
引入式带来了数据库引用的概念:
两种引用方法:手动 / DBRefs :DBRefs形式为在需引用的字段中插入{$ref: 集合名称, $id: 引用_id, $db: 库名称(可选)}
db.集合.remove(); 删除文档(已被舍弃,改用deleteOne等)
for(let i=x;i<x;i++){} 循环操作
db.集合.updateOne({条件},{$set:{更改后}}) set的作用是保留除更改之外的值(原来的版本如果不写set的话,其他字段默认删除,版本6会报错)
通过$set引出原子操作:
$set 指定更新 push/pushall追加 unset指定删除 inc指定数删减 pull删除一个等于某个的键 pop rename
db.集合.find([条件],[查询字段{字段:0/1(1返回)}])[.pretty()超过一定长度的文档格式化]; 查询集合
查询条件:
等于: 小于:$lt 小于等于:$lte 大于:$gt 大于等于:$gte 不等于:$ne
mysql中and ==> 逗号, 如果字段相同,以最后一个为准
mysql中or ==> {$or:[{条件},{条件}]}
模糊查询: 使用正则表达式(PCRE):用$regex,语法为下面之一
{ <field>: { $regex: /pattern/, $options: '<options>' } } { <field>: { $regex: 'pattern', $options: '<options>' } } { <field>: { $regex: /pattern/<options> } }
<options>有 i 不区分大小写,m 指定的行多行匹配,x 忽略模式中所有空白字符,s 允许点字符(.)匹配所有字符
具体 $正则表达式_MonogDB 中文网 (mongodb.net.cn)
数组查询: 跟普通查询相同,特殊$size:查询数组符合长度的
操作符$type 按照数据类型(object/简写1,string/简写2,double3,array4) 例: {$type:4}
索引:B树,类似于mysql的自增id,但mysql索引用的是B+树
getIndexes,createIndex({需要建立索引的字段(可以是复合(一个索引由多个key维护))},{其他可选参数(name,unique唯一,expireAfterSeconds)})
dropIndex("索引名称"),totalIndexSize()索引占用大小,
关于复合索引(要符合左前缀原则,比如字段id,name,age,那么id,age不能组成复合索引,而name,age/id,name可以(顺序可以变更))(排序中也符合这种原则)
索引的执行计划(查询分析):判断查询是否基于索引,.explain([options]) 返回中winningPlan含有COLLSCAN是全局扫描,没用索引,FETCH抓取是用到了索引 以及hint也是查询分析
全文索引:全文索引集合中只能存在一个但可以复合,慎用:占据空间可能很大
聚合查询aggregate类似于mysql中count, 例db.集合.aggregate([{$group:{_id: "$字段名" , num_tutorial: {$sum : 1}}]) (以字段名为组求和)(类似于$还有avg max min first last等)
管道函数:如上面的例子,将输出的结果作为参数执行,$group skip limit project修改文档结构 match过滤 sort
排序: .sort({字段:1/-1})1升,-1降
分页: .skip(第几页).limit(一页几条)
计数.count
去重.distinct
备份/恢复:mongodb -h ip -d 库名称 -o 备份地址 mongorestore -h ip -d 库名称 --drop(先删除原来的) <路径>
监控:mongostat/mongotop --host ip:端口 -u用户 -p密码 a authenticationDatabase(必须是admin库) 时间(只有mongotop) 新版本貌似将监控指令移到独立安装的包中了?
副本集:是mongodb中具有自动故障转移的主从集群复制功能的结构,主要解决数据冗余备份,架构高可用问题,无法解决单点压力问题(这个需要集群完成)
搭建副本集:./mongod --port 27017 --dbpath ../rep1/data1(需创建) --bind_ip 0.0.0.0 --replSet 副本集名称/[localhost(如果远程调用得用公网ip,最好使用公网):27018,localhost/公网ip:27019]
./mongod --port 27018 --dbpath ../rep1/data2(需创建) --bind_ip 0.0.0.0 --replSet 副本集名称/[localhost:27017,localhost:27019]
./mongod --port 27019 --dbpath ../rep1/data3(需创建) --bind_ip 0.0.0.0 --replSet 副本集名称/[localhost:27017,localhost:27018]
初始化副本集:use admin
var config = {_id:副本集名称, members:[{_id:0, host:"localhost(对应启动服务时是公网还是本地): 27017"}, {第二}, {第三}]}
rs.initiate(config)
副本集主节点默认可读可写,从节点不可读写(可以通过rs.secondaryOK(6版本疑似弃用该函数,改为db.getMongo().setReadPref("primaryPreferred")代替;)授予读权限)
增加副本集rs.add(ip:端口)
分片集群:也称分区,将数据拆分存储在不同机器的过程,集群内部切分数据时会自动做负载均衡,在拆分之前会启用mongos进程(路由进程)来分片
注意:shard为分片数据库(每个分片再分别采用副本集),而config是临时保存所有数据的数据库(包括分了哪些片,以及每片所对应的端口)(同样也采用副本集)
片键(shard key):指定负载均衡策略(用哪个字段来分片)(官方提供策略:_id:用hash策略)
流程:
创建cluster目录,里面分别创建多个shard及它的副本集,在创建config副本集
启动shard服务(多了个--shardsvr),启动config服务(多了个--configsvr),所有服务都需副本集初始化
启动mongos路由服务,./mongos --port --configdb config/config服务的ip:端口(多个) --bind_ip 0.0.0.0
登录mongos服务:1. use admin 2. 添加分片信息 db.runCommand({addshard:"副本集名称/ip:路由, ip:路由", "allowLocal:true"})(多个)3. 指定分片数据库db.runCommand({enblesharding:"库名"})
4. 设置库的片键信息:db.runCommand({shardcollection:"库中集合"},key{片键: 1(启用)})
Map-Reduce:计算模型,将大批量的工作(数据)分批次(Map)执行,然后在合并成最终结果(Reduce)
语法:db.集合.mapReduce = (
function() {emit(key,value)}// map
function(key,values) {return reduceFunction}// reduce
{
out: 临时存放结果集合(客户端断开后删除)
query: 查询条件
sort: limit后的排序
limit: 传给map的限制
}
后续查看结果可以db.out的结果.find()
自增id:如果数据库存放需要自增id的需求,可以写一个函数,每次id取值的是函数返回的结果
参考:MongoDB 自动增长 | 菜鸟教程 (runoob.com)
function getNextSequenceValue(sequenceName){ var sequenceDocument = db.counters.findAndModify( { query:{_id: sequenceName }, update: {$inc:{sequence_value:1}}, "new":true }); return sequenceDocument.sequence_value; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本