MongoDB学习记录
文章目录
- 基本
- CURD 增删改查
- insert
- 更新
- 覆盖更新
- 局部修改
- 自增 `inc`
- 更新多条
- 删表
- 分页
- 排序
- 正则表达式查询
- 比较查询
- 条件查询 `and` 和 `or`
- 索引
- 1. 单字段索引
- 2. 复合索引
- 3. 地理空间索引
- 4. 文本索引
- 5. 哈希索引
- 索引的执行计划
- explain
- 涵盖查询
- 在SpringBoot中使用Mongo
- 文章评论的增删改查
- 副本集 `replica set`
- 副本集的创建
- 初始化副本
- 副本集的读写
- 分片
- 聚合命令
官方文档
基本
show dbs
显示有多少数据库show tables
显示当前使用的数据库中有多少表- mongodb存储机制
分为内存和磁盘存储
新创建的数据库在内存中,当数据库有内容后持久化到磁盘中
创建数据库/使用数据库
use 库名
db
查看当前数据- 三个特殊的库
admin
; 管理用户和权限
local
: 主从复制时, 只保留在本地不参与复制的库
config
: 用于保存分片相关的信息
删库 删除掉当前use的数据库
db.dropDatabase()
删表
db.表名.drop()
创建集合
集合: 类似mysql的表
文档: 类似mysql的一条数据
向集合中插入一条文档, 如果集合不存在, mongo自动创建集合
CURD 增删改查
insert
insert_one
插入一条
db.集合名.insert({"name": "zhangsan"})
insert_many
插入多条
db.集合名.insert_many([{"name": "王二"},{"name": "陈清扬"}
])
更新
覆盖更新
该条文档中的其它字段全部清除,只保留更新字段
> 修改前 {"_id": 1, "name": "zhang", "age": 23}db.表名.update({"_id": 1, {"age": 18})> 修改后 {"_id": 1, "age": 18}
局部修改
更新这个字段对应的值, 其它数据保留
> 修改前 {"_id": 1, "name": "zhang", "age": 23}db.表名.update({"_id": 1, {"age": 18})> 修改后 {"_id": 1, "name": "zhang", "age": 18}
自增 inc
db.表名.update({"条件": "值"}, {$inc: {"自增的字段": "自增数量"}})
{_id: 1,sku: "abc123",quantity: 10,metrics: {orders: 2,ratings: 3.5}
}如下$inc操作符将quantity减2,metrics.orders内嵌文档字段加1db.products.update({ sku: "abc123" },{ $inc: { quantity: -2, "metrics.orders": 1 } }
)结果
{"_id" : 1,"sku" : "abc123","quantity" : 8,"metrics" : {"orders" : 3,"ratings" : 3.5}
}
更新多条
db.collection.update( <query>, <update>, { upsert: <boolean>, multi: <boolean>, writeConcern: <document>}
)
参数说明:
- query : update的查询条件,类似sql update查询内where后面的。
- update : update的对象和一些更新的操作符(如,,,inc…)等,也可以理解为sql update查询内set后面的
upsert
: 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。multi
: 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。- writeConcern :可选,抛出异常的级别。
update
方法默认只更新找到的第一条数据, 如果要更新所有找到的数据, 只需要再
添加一个参数即可
db.表名.update({"name": "zhang"}, {"age": 18}, {multi: true})
- 在命令行美化输出
pretty()
db.表名.find().pretty()
- 统计表中有多少条数据
db.表名.count()
# 也可以加上条件计数
db.表名.count({"name": "zhangsan"})
删表
db.表名.remove({"name": "zhang"}) # 不加条件就是全表删除
课程看到
黑马程序员
文章目录
- 基本
- CURD 增删改查
- insert
- 更新
- 覆盖更新
- 局部修改
- 自增 `inc`
- 更新多条
- 删表
- 分页
- 排序
- 正则表达式查询
- 比较查询
- 条件查询 `and` 和 `or`
- 索引
- 1. 单字段索引
- 2. 复合索引
- 3. 地理空间索引
- 4. 文本索引
- 5. 哈希索引
- 索引的执行计划
- explain
- 涵盖查询
- 在SpringBoot中使用Mongo
- 文章评论的增删改查
- 副本集 `replica set`
- 副本集的创建
- 初始化副本
- 副本集的读写
- 分片
- 聚合命令
分页
关键字
limit(n)
限制输出条数, 最多输出n条skip(n)
跳过前n条数据
查询第3到5条数据
db.表名.find().skip(2).limit(3)
排序
关键字
sort({"字段一": 1, "字段二": -1})
数值1升序, 数值-1降序
根据字段一
升序, 如果字段一有相同的值, 再根据字段二
排序
正则表达式查询
db.表名.find("name": /z/)
# 查询name中包含z的文档db.表名.find("name": /^z/)
# 查询name以z开头的文档
比较查询
# 查询 name == "zhang"
db.表名.find({"name": {$eq: "zhang"}})
# 查询 name in ["zhang", li]
db.表名.find({"name": {$in: ["zhang", "li"]}})
条件查询 and
和 or
基本语法
db.表名.find({$and: [{"条件": ""}, {"条件": ""}]})
# 例如查询年龄大于18的女生
db.表名.find({$and: [{"age": {$gt: NumberInt(18)}}, {"sex": "girl"}]})
索引
官方文档-索引
优点: 加快查询速度
缺点: 维护索引的数据结构(b-tree)需要消耗资源
1. 单字段索引
例如根据分数score降序的索引
{score: 1}
2. 复合索引
例如根据分数score降序,学号升序的索引
{score: 1, "stu_num": -1}
3. 地理空间索引
地理空间坐标
4. 文本索引
在集合中搜索字符串内容
5. 哈希索引
相等比较很有用
视频观看 索引的查/建/删
官方文档-索引
查看索引
db.表名.getIndexes()
# _id 默认有索引
创建索引(单字段/多字段)
db.表名.createIndex({字段一: 1, 字段二: -1}) # 创建索引,字段一升序,字段二降序
db.tb_time_dirs.createIndex({tb_dirs_id: 1, day: 1})/* 1 */
{"createdCollectionAutomatically" : false,"numIndexesBefore" : 1,"numIndexesAfter" : 2,"ok" : 1.0
}
删除索引
- 根据创建索引时的格式删除索引
db.表名.dropIndex({字段一: 1})
- 根据
db.表名.getIndexes()
查出的name
的值删除
db.getIndexes() # 1. 先查询出索引的 name
db.表名.dropIndex(name) # 2. 删除
- 删除表的全部索引,
_id
索引不会被删除
db.表名.dropIndexes()
索引的执行计划
分析查询性能 Analyze Query Performance
衡量索引使用
# 查询每个索引的使用情况
db.表名.aggregate( [ { $indexStats: { } } ] )# 查询结果
/* 1 */
{"name" : "_id_","key" : {"_id" : 1},"host" : "hg-162-41.dev.odeon.cn:27017","accesses" : {"ops" : NumberLong(8),"since" : ISODate("2021-09-01T11:59:14.586Z")}
}/* 2 */
{"name" : "src_hashed","key" : {"src" : "hashed"},"host" : "hg-162-41.dev.odeon.cn:27017","accesses" : {"ops" : NumberLong(202500),"since" : ISODate("2021-09-03T02:14:01.120Z")}
}
explain
返回关于查询过程的统计信息,包括使用的索引、扫描的文档数量以及查询处理所用的时间(以毫秒为单位)
db.getCollection('tb_dirs').find({src: "/project/jiaoyan_dm/ddwu8/gzwl/gzwl_recommend_gaoer1"}).explain()/* 1 */
{"queryPlanner" : {"plannerVersion" : 1,"namespace" : "except_dir.tb_dirs","indexFilterSet" : false,"parsedQuery" : {"src" : {"$eq" : "/project/jiaoyan_dm/ddwu8/gzwl/gzwl_recommend_gaoer1"}},"winningPlan" : {"stage" : "FETCH","filter" : {"src" : {"$eq" : "/project/jiaoyan_dm/ddwu8/gzwl/gzwl_recommend_gaoer1"}},"inputStage" : {"stage" : "IXSCAN","keyPattern" : {"src" : "hashed"},"indexName" : "src_hashed","isMultiKey" : false,"isUnique" : false,"isSparse" : false,"isPartial" : false,"indexVersion" : 2,"direction" : "forward","indexBounds" : {"src" : [ "[4871011750922934306, 4871011750922934306]"]}}},"rejectedPlans" : []},"serverInfo" : {"host" : "hg-162-41.dev.odeon.cn","port" : 27017,"version" : "4.0.26","gitVersion" : "f12d07945bd82ff9b6726aa74b84ea4e94b06171"},"ok" : 1.0
}
在"winningPlan" : "stage" : "FETCH",
查看到 FETCH
就表示使用到了索引
主要介绍一下常用的属性
涵盖查询
建立的索引包含了要查询的字段, 此时速度会特别快
例如对
name
建立了索引, 并且在查询时只要name
db.表名.createIndex({name: 1})
db.表名.find({"name": "zhangsan"}, {"name": 1, "_id": 0})
db.getCollection('tb_dirs').find({src: "/project/jiaoyan_dm/ddwu8/gzwl/gzwl_recommend_gaoer1"}, {_id: 0, src:1}).explain()/* 1 */
{"queryPlanner" : {"plannerVersion" : 1,"namespace" : "except_dir.tb_dirs","indexFilterSet" : false,"parsedQuery" : {"src" : {"$eq" : "/project/jiaoyan_dm/ddwu8/gzwl/gzwl_recommend_gaoer1"}},"winningPlan" : {"stage" : "PROJECTION","transformBy" : {"_id" : 0.0,"src" : 1.0},"inputStage" : {"stage" : "FETCH","filter" : {"src" : {"$eq" : "/project/jiaoyan_dm/ddwu8/gzwl/gzwl_recommend_gaoer1"}},"inputStage" : {"stage" : "IXSCAN","keyPattern" : {"src" : "hashed"},"indexName" : "src_hashed","isMultiKey" : false,"isUnique" : false,"isSparse" : false,"isPartial" : false,"indexVersion" : 2,"direction" : "forward","indexBounds" : {"src" : [ "[4871011750922934306, 4871011750922934306]"]}}}},"rejectedPlans" : []},"serverInfo" : {"host" : "hg-162-41.dev.odeon.cn","port" : 27017,"version" : "4.0.26","gitVersion" : "f12d07945bd82ff9b6726aa74b84ea4e94b06171"},"ok" : 1.0
}
文章目录
- 基本
- CURD 增删改查
- insert
- 更新
- 覆盖更新
- 局部修改
- 自增 `inc`
- 更新多条
- 删表
- 分页
- 排序
- 正则表达式查询
- 比较查询
- 条件查询 `and` 和 `or`
- 索引
- 1. 单字段索引
- 2. 复合索引
- 3. 地理空间索引
- 4. 文本索引
- 5. 哈希索引
- 索引的执行计划
- explain
- 涵盖查询
- 在SpringBoot中使用Mongo
- 文章评论的增删改查
- 副本集 `replica set`
- 副本集的创建
- 初始化副本
- 副本集的读写
- 分片
- 聚合命令
在SpringBoot中使用Mongo
- 新建一个maven项目
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.4</version><relativePath/></parent><groupId>com.itcast</groupId><artifactId>itcast_mongo</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId></dependency></dependencies></project>
- 连接数据库 resources/application.yml
spring:data: # 指定数据源mongodb:host: 192.168.1.101database: articledbport: 27017
- Java程序 类 com.itcast.article.ArticleApplication
package com.itcast.article;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class ArticleApplication {public static void main(String[] args) {SpringApplication.run(ArticleApplication.class, args);}
}
运行, 没报错就是成功了
- 实体类
implements Serializable的作用
package com.itcast.article.po;import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.index.CompoundIndex;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Field;
import org.springframework.data.mongodb.core.mapping.Document;import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;@Document(collection = "comment") // 对应数据库中的表名, 如果和下面的类名小写相同可以不用写
@CompoundIndex(def = "{'userid': 1, 'nickname': -1}") // 创建复合索引,建议在数据库中创建
public class Comment implements Serializable {@Idprivate String Id;@Field("content") // 数据库中的字段名; 如果和下面的变量名一致private String content;@Indexed // 创建一个单字段的索引private String userid;private Date publishTime;private String nickname;private LocalDateTime createdatetime;private Integer likenum;private Integer replynum;private String state;private String parentid;private String articleid;// getter/setter省略}
文章评论的增删改查
编程上的内容跳过
副本集 replica set
副本集-博客
MongoDB 中的副本集(Replica Set)是一组维护相同数据集的 mongod 服务。 副本集可提供冗余和高可用性,是所有生产部署的基础。
也可以说,副本集类似于有自动故障恢复功能的主从集群。通俗的讲就是用多台机器进行同一数据的异步同步,从而使多台机器拥有同一数据的多个副本,并且当主库当掉时在不需要用户干预的情况下自动切换其他备份服务器做主库。而且还可以利用副本服务器做只读服务器,实现读写分离,提高负载。
冗余和数据可用性
复制提供冗余并提高数据可用性。 通过在不同数据库服务器上提供多个数据副本,复制可提供一定级别的容错功能,以防止丢失单个数据库服务器。
在某些情况下,复制可以提供增加的读取性能,因为客户端可以将读取操作发送到不同的服务上, 在不同数据中心维护数据副本可以增加分布式应用程序的数据位置和可用性。 还可以为专用目的维护其他副本,例如灾难恢复,报告或备份。
MongoDB 中的复制
副本集是一组维护相同数据集的 mongod 实例。 副本集包含多个数据承载节点和可选的一个仲裁节点。 在承载数据的节点中,一个且仅一个成员被视为主节点,而其他节点被视为次要(从)节点。
主节点接收所有写操作。 副本集只能有一个主要能够确认具有 {w:“most”} 写入关注的写入; 虽然在某些情况下,另一个 mongod 实例可能暂时认为自己也是主要的。主要记录其操作日志中的数据集的所有 更改,即 oplog。
辅助(副本)节点复制主节点的oplog并将操作应用于其数据集,以使辅助节点的数据集反映主节点的数据 集。 如果主要人员不在,则符合条件的中学将举行选举以选出新的主要人员。
主从复制和副本集区别
主从集群和副本集最大的区别就是副本集没有固定的”主节点”;整个集群会选出一个”主节点”,当其挂掉后,又在剩下的从节点中选中其他节点为主节点,副本集总有一个活跃点 (主、primary) 和一个或多个备份节点 (从、secondary)
1.2 副本集的三个角色
副本集有两种类型三种角色
两种类型:
主节点Primary类型:数据操作的主要连接点,可读写
次要(辅助、从)节点(Secondary)类型:数据冗余备份节点,可以读或选举
三种角色:
主要成员(Primary):主要接收所有写操作。就是主节点
副本成员(Replicate):从主节点通过复制操作以维护相同的数据集,即备份数据,不可写操作,但可以读操作(但需要配置)。是默认的一种从节点类型
仲裁者(Arbiter):不保留任何数据的副本,只具有投票选举作用。当然也可以将仲裁服务器维护为副本集的一部分,即副本成员同时也可以是仲裁者。也是一种从节点类型。
副本集的创建
文档
在vim中粘贴复制,格式错乱的解决
vim的阅读模式先输入冒号,然后分别执行即可
set nosmartindent
set noautoindent
创建主节点
mkdir -p /mongodb/replica_set/myrs_27017/log
mkdir -p /Users/didi/xzy/replica_sets/myrs_27017/data/db
新建或修改配置文件:
vim /Users/didi/xzy/replica_sets/myrs_27017/mongod.conf
如果安装的地方不一样,注意路径
systemLog:#MongoDB发送所有日志输出的目标指定为文件destination: file#mongod或mongos应向其发送所有诊断日志记录信息的日志文件的路径path: "/Users/didi/xzy/replica_sets/myrs_27017/log/mongod.log"#当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的末尾。logAppend: true
storage:#mongod实例存储其数据的目录,storage.dbPath设置仅适用于mongod。dbPath: "/Users/didi/xzy/replica_sets/myrs_27017/data/db"journal:#启用或禁用持久性日志以确保数据文件保持有效和可恢复。enabled: true
processManagement:#启用在后台运行mongos或mongod进程的守护进程模式fork: true#指定用于保存mongos或mongod进程的进程ID的文件位置,其中mongos或mongod将写入其PIDpidFilePath: "/Users/didi/xzy/replica_sets/myrs_27017/log/mongod.pid"
net:#服务实例绑定所有IP,有副作用,副本集初始化的时候,节点名字会自动设置为本地域名,而不是ip#bindIpAll:true#服务实例绑定的IPbindIp: localhost#bindIp#绑定的端口port: 27017
replication:#副本集的名称replSetName: myrs
启动
mongod -f /Users/didi/xzy/replica_sets/myrs_27017/mongod.conf
创建副本节点
可读不可写
mkdir -p /mongodb/replica_set/myrs_27018/log
mkdir -p /Users/didi/xzy/replica_sets/myrs_27018/data/db
新建或修改配置文件:
vim /Users/didi/xzy/replica_sets/myrs_27018/mongod.conf
可直接复制27017中的配置文件, 然后修改端口号 27018
和文件路径
vim中批量替换
:%s/27017/27018/
启动
mongod -f /Users/didi/xzy/replica_sets/myrs_27018/mongod.conf
创建仲裁节点
mkdir -p /mongodb/replica_set/myrs_27019/log
mkdir -p /Users/didi/xzy/replica_sets/myrs_27019/data/db
新建或修改配置文件:
vim /Users/didi/xzy/replica_sets/myrs_27019/mongod.conf
可直接复制27017中的配置文件, 然后修改端口号 27019
和文件路径
vim中批量替换
:%s/27017/27019/
启动
mongod -f /Users/didi/xzy/replica_sets/myrs_27019/mongod.conf
初始化副本
> rs.initiate()
{"info2" : "no configuration specified. Using a default configuration for the set","me" : "localhost:27017","ok" : 1,"$clusterTime" : {"clusterTime" : Timestamp(1630774321, 1),"signature" : {"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),"keyId" : NumberLong(0)}},"operationTime" : Timestamp(1630774321, 1)
}
查看配置
myrs:PRIMARY> rs.conf()
{"_id" : "myrs","version" : 1,"protocolVersion" : NumberLong(1),"writeConcernMajorityJournalDefault" : true,"members" : [{"_id" : 0,"host" : "localhost:27017","arbiterOnly" : false,"buildIndexes" : true,"hidden" : false,"priority" : 1,"tags" : {},"slaveDelay" : NumberLong(0),"votes" : 1}],"settings" : {"chainingAllowed" : true,"heartbeatIntervalMillis" : 2000,"heartbeatTimeoutSecs" : 10,"electionTimeoutMillis" : 10000,"catchUpTimeoutMillis" : -1,"catchUpTakeoverDelayMillis" : 30000,"getLastErrorModes" : {},"getLastErrorDefaults" : {"w" : 1,"wtimeout" : 0},"replicaSetId" : ObjectId("6133a4317c47df0c55d648ca")}
}
查看状态 rs.status()
myrs:PRIMARY> rs.status()
{"set" : "myrs","date" : ISODate("2021-09-04T16:56:11.323Z"),"myState" : 1,"term" : NumberLong(1),"syncingTo" : "","syncSourceHost" : "","syncSourceId" : -1,"heartbeatIntervalMillis" : NumberLong(2000),"majorityVoteCount" : 1,"writeMajorityCount" : 1,"optimes" : {"lastCommittedOpTime" : {"ts" : Timestamp(1630774561, 1),"t" : NumberLong(1)},"lastCommittedWallTime" : ISODate("2021-09-04T16:56:01.522Z"),"readConcernMajorityOpTime" : {"ts" : Timestamp(1630774561, 1),"t" : NumberLong(1)},"readConcernMajorityWallTime" : ISODate("2021-09-04T16:56:01.522Z"),"appliedOpTime" : {"ts" : Timestamp(1630774561, 1),"t" : NumberLong(1)},"durableOpTime" : {"ts" : Timestamp(1630774561, 1),"t" : NumberLong(1)},"lastAppliedWallTime" : ISODate("2021-09-04T16:56:01.522Z"),"lastDurableWallTime" : ISODate("2021-09-04T16:56:01.522Z")},"lastStableRecoveryTimestamp" : Timestamp(1630774561, 1),"lastStableCheckpointTimestamp" : Timestamp(1630774561, 1),"electionCandidateMetrics" : {"lastElectionReason" : "electionTimeout","lastElectionDate" : ISODate("2021-09-04T16:52:01.434Z"),"electionTerm" : NumberLong(1),"lastCommittedOpTimeAtElection" : {"ts" : Timestamp(0, 0),"t" : NumberLong(-1)},"lastSeenOpTimeAtElection" : {"ts" : Timestamp(1630774321, 1),"t" : NumberLong(-1)},"numVotesNeeded" : 1,"priorityAtElection" : 1,"electionTimeoutMillis" : NumberLong(10000),"newTermStartDate" : ISODate("2021-09-04T16:52:01.476Z"),"wMajorityWriteAvailabilityDate" : ISODate("2021-09-04T16:52:01.509Z")},"members" : [{"_id" : 0,"name" : "localhost:27017","health" : 1,"state" : 1,"stateStr" : "PRIMARY","uptime" : 1933,"optime" : {"ts" : Timestamp(1630774561, 1),"t" : NumberLong(1)},"optimeDate" : ISODate("2021-09-04T16:56:01Z"),"syncingTo" : "","syncSourceHost" : "","syncSourceId" : -1,"infoMessage" : "","electionTime" : Timestamp(1630774321, 2),"electionDate" : ISODate("2021-09-04T16:52:01Z"),"configVersion" : 1,"self" : true,"lastHeartbeatMessage" : ""}],"ok" : 1,"$clusterTime" : {"clusterTime" : Timestamp(1630774561, 1),"signature" : {"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),"keyId" : NumberLong(0)}},"operationTime" : Timestamp(1630774561, 1)
}
myrs:PRIMARY>
视频观看至
添加副本节点
rs.add("ip:27018")
添加仲裁节点
仲裁节点不存放任何数据
rs.addArb("ip:27019")
看见 "ok": 1
即为成功
查看状态
rs.status()
查看 members
中有三个成员; 查看stateStr
的值为角色, 包括 PRIMARY, SECONDARY, ARBITER
副本集的读写
1. 登录从节点 secondary
mongo --port=27018
2. 改节点承认他是从节点
rs.secondaryOk(true) // 不承认时改为 false 即可
主节点插入一条数据
myrs:PRIMARY> db.comment.insert({"articleid": "10000", "content": "今天天气真好", "userid":"1001", "nickname":"rose","createdatetime":new Date()})在从节点上查看
myrs:SECONDARY> rs.secondaryOk(true)
myrs:SECONDARY> show dbs;
admin 0.000GB
comment 0.000GB
config 0.000GB
local 0.000GB
myrs:SECONDARY> use comment
switched to db comment
myrs:SECONDARY> db.comment.find()
{ "_id" : ObjectId("613436560396c4d571269381"), "articleid" : "10000", "content" : "今天天气真好", "userid" : "1001", "nickname" : "rose", "createdatetime" : ISODate("2021-09-05T03:15:34.092Z") }
仲裁节点即使
rs.secondaryOk(true)
可不能同步主节点的数据,show dbs
只能看到 local 库
故障测试
从节点宕机
从节点宕机不影响主节点的读写, 当从节点恢复后,数据也会自动同步到从节点
主节点宕机
主节点宕机后, 某个从节点会升级为主节点负责读写操作, 当原来的主节点恢复后会变为从节点
仲裁节点和主节点宕机
从节点还是从节点
由于本实验只用了三个实例, 宕机了两个实例,还剩从节点, 虽然从节点获得自己投的一票,票数最高,但是他不满足 多数的投票,即 (n//2+1) 票,这里是2票
仲裁节点和从节点宕机
服务降级
主节点降级为从节点,只读
分片
聚合命令
注意看这个示例
示例
use test
db.stu.insert({"name": "n1", "hometown":"蒙古", "age": 20, "gender": true})
db.stu.insert({"name": "n2", "hometown":"黑龙江", "age": 30, "gender": false})
db.stu.insert({"name": "n3", "hometown":"辽宁", "age": 80, "gender": true})
db.stu.insert({"name": "n4", "hometown":"东北", "age": 40, "gender": false})
db.stu.insert({"name": "n5", "hometown":"江西", "age": 10, "gender": true})
db.stu.insert({"name": "n6", "hometown":"四川", "age": 50, "gender": false})# 1. 将性别gender分组
myrs:PRIMARY> db.stu.aggregate({$group: {_id: "$gender"}})
{ "_id" : false }
{ "_id" : true }# 2. 统计男女共有多少人
myrs:PRIMARY> db.stu.aggregate({$group: {_id: "$gender", count: {$sum: 1}}})
{ "_id" : false, "count" : 3 }
{ "_id" : true, "count" : 3 }# 3. 统计男女的平均年龄
myrs:PRIMARY> db.stu.aggregate({$group: {_id: "$gender", count: {$sum: 1}, avg_age: {$avg: "$age"}}})
{ "_id" : false, "count" : 3, "avg_age" : 40 }
{ "_id" : true, "count" : 3, "avg_age" : 36.666666666666664 }
MongoDB学习记录相关推荐
- MongoDB学习记录:入门(一)——五叶草
预热看我之前的文章Node学习记录: mongodb 这个系列旨在系统的学习Mongodb 部分图片来自慕课网mongodb入门截图 学习目标 MongoDB官网:https://www.mongod ...
- MongoDB 学习记录
这里写目录标题 MongoDB 基础 什么是MongoDB ? MongoDB基本概念 MongoDB 应用场景 MongoDB 特性及优势 MongoDB 安装 cmd命令增删改查 索引 索引命令 ...
- MongoDB学习记录10-分片-副本集(mongodb3.2版本以前)
结构图 准备工作 在配置之前先说明几个概念 路由 请求的入口,所有请求都经过mongos协调和分发.通常部署多个实例,以便当一个mongos失败时,应用层驱动可以切换到其他正常的实例上.此外也可以通过 ...
- M001: MongoDB Basics Chapter 3: Deeper Dive on the MongoDB Query Language学习记录
M001: MongoDB Basics Chapter 3: Deeper Dive on the MongoDB Query Language学习记录 运行环境 操作系统:windows 10 家 ...
- mongodb的学习记录
node.js中的mongodb的学习记录: //1.创建并进入it_like数据库 use itlike db//2.向数据库的colleges集合中插入六个文档(Html5, Java, Pyth ...
- M102: MongoDB for DBAs chapter 3 performance学习记录
M102: MongoDB for DBAs chapter 3 performance学习记录 运行环境 操作系统:windows 10 家庭中文版 Mongodb :Mongodb 3.4 Mon ...
- M001: MongoDB Basics chapter 2 The MongoDB Query Language + Atlas学习记录
M001: MongoDB Basics chapter 2 The MongoDB Query Language + Atlas学习记录 运行环境 操作系统:windows 10 家庭中文版 Mon ...
- M201: MongoDB Performance chapter 4 CRUD Operations学习记录
M201: MongoDB Performance chapter 4 CRUD Operations学习记录 运行环境 操作系统:windows 10 家庭中文版 Mongodb :Mongodb ...
- M201: MongoDB Performance Final Exam学习记录
M201: MongoDB Performance Final Exam学习记录 运行环境 操作系统:windows 10 家庭中文版 Mongodb :Mongodb 3.4 Mongodb安装路径 ...
最新文章
- java IO流文件的读写具体实例
- pg 时间戳 能与整数比较大小吗_小学数学55组重要知识“顺口溜”+必考题型口诀,一遍就能记住!...
- codevs——1019 集合论与图论
- [Z]图灵奖获得者Richard Karp讲述Berkeley CS的发展史
- 自由自在珍珠奶茶让奶茶文化更加多元
- AI理论知识整理(16)-线性方程组有解
- es 删除数据_es 写入数据的工作原理是什么啊?es 查询数据的工作原理是什么啊?...
- 服务器遍历文件夹不按顺序,绕过遍历检查 (Windows 10) - Windows security | Microsoft Docs...
- ChemBioDraw 制作DMT屏保
- 计算机专业英语词汇mp3,【听单词】计算机专业英语词汇音频106,计算机英语单词MP3...
- 社招2017-阿里、网易、滴滴共十次前端面试碰到的问题
- 部署Nginx+Keepalived
- Windows黑客编程第二章
- null object java_java1.8--Null Object模式
- 虾皮有哪些站点?各站点有什么特色
- java 6 17 32_java学习class6(1)
- Java正则验证经纬度
- 百面机器学习2---模型评估
- LPC1788 引脚分析
- 电脑python编程软件哪个好用_5个最好用的Python编程开发工具(IDE)分享
热门文章
- 服务器维护lol3.23,LOL3月23日测试服更新公告 3月23日更新内容介绍
- MFC设置字体的大小、下划线等内容
- Java开发必学:Java开发进大厂面试必备技能,技术总监都拍手叫好
- unity 内部嵌入的网页插件中播放视频网页的问题
- ogr 缓冲区_OGR几何关系与操作
- Android数字华容道代码,Android源码 之《最强大脑》“数字华容道”
- huan shen总结
- 正点原子DS100拆解全过程-硬件工程师必备
- [hive 报错]:FAILED: SemanticException Line 0:-1 Partition not found
- discuz当qq绑定超过5个网址时 如何解除绑定qq