# mongodb-study **Repository Path**: wlyfree/mongodb-study ## Basic Information - **Project Name**: mongodb-study - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2019-09-26 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # `MongoDB` ##### `简介` - 由`c++`开发,数据存储格式:`BSON` ###### 优点 - 基于`BSON`存储,能比较好的数据结构适应变化 - 可以充分利用内存,缓存热点数据,查询效率高于`mysql` - 支持副本和分片,便于扩容、高可用 - 支持`map-reduce`框架,方数据统计 ###### 缺点 - 不支持多表join操作 - 事务薄弱,只支持单文档事务 - 稳定性略差,指定`_id`的场景效率明显下降 ###### 适用场景 - 数据结构变化比较大 - 缓存 - 实时日志存储 - 文件的分布式存储 ###### 不适用场景 - 高度事务性系统 - 跨多表查询系统 ##### 对比关系型数据库 | | `MYSQL` | `MongoDB` | | ---------- | --------------- | ------------ | | 数据库模型 | 关系型 | 非关系型 | | 存储方式 | 虚拟内存+持久化 | 依赖存储引擎 | | 数据库 | database | db | | 表 | table | collection | | 行 | row | document | | 列/字段 | column | field | | 索引 | index | index | | 主键 | primary key | _id | ##### 命令行`shell` ###### `Database`(db) `show dbs`:查询所有`database` `db`:打印当前使用的`database` `use wly`:切换或创建`databases` `db.dropDatabase()`:删`database` ###### `Collection`(table) `db.createCollection("wlyCollection")`:建表 `db.wlyCollection.drop()`:删表 `show tables`:查询所有表 `show collections`:查询所有表 ###### `Document`(row) `db.myCollection.insert({"name":"菜鸟"})`:插入`document` `db.wlyCollection.find()`:查询所有`document` `db.wlyCollection.update({"name":"wly"},{$set:{'title':'myTitle'}})`:更新`document` `db.wlyCollection.remove({"name":"wly"})`:删除`document` ###### 按照类型查询 $type:2代表查询age字段值为字符串的`document` `db.wlyCollection.find({"age":{$type:2}})` ###### 比较 查询age字段>20的数据 `db.wlyCollection.find({age:{$gt : 20}})` ###### 排序 按照name字段排序,1代表升序,-1代表降序 `db.wlyCollection.find().sort({"name":1})` ###### 限制查询结果 limit(n):限制查询n条数据,skip(n):跳过n条数据。以下查询相当于跳过第一条数据只查询一条数据,即只查询第二条数据 ` db.wlyCollection.find().limit(1).skip(1)` ###### 索引 创建索引 `db.wlyCollection.createIndex({"name":1,"age":-1})` 查询索引 `db.wlyCollection.getIndexes()` 统计索引大小 `db.wlyCollection.totalIndexSize()` ###### 聚合 `aggregate()`:聚合操作,`count(*)`、`avg(xx)`... 等同于`select name,count(*) from wlyCollection group by name` `db.wlyCollection.aggregate([{$group:{_id:"$name",num_tutorial:{$sum:1}}}])` ##### 副本集 - 异步复制,主节点写`oplog`,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作。 - 高可用和故障转移,主节点宕机,从节点可以接管 - 支持动态增删节点 - 分布式读取:一主一从、一主多从,主节点负责读写,从节点只负责读 - 可以做灾备 ##### 分片 ###### 分片背景 单机数据量过大,磁盘存储不足 单机请求量过大,内存不足或吞吐量达到瓶颈 ###### 组件 - shard - 存储实际的数据块,多个shard组成一个replica set - config server - mongod实例,存储整个ClusterMetadata,包含chunk信息 - Query Routers - 前端路由,客户端由此接入,shard等内容对用户透明 ##### 数据备份和恢复 ###### 数据备份 `mongodump`命令 ###### 数据恢复 `mongostore`命令 ##### 监控 `mongostat`、`mongotop`命令 ##### 查询效率分析 - `explain()`:类似`mysql`的`explain` - `db.wlyCollection.find().explain()` - `hint()`:强制指定一个索引 ##### 主键 - 自动生成主键:`_id`,12字节,数据类型为`ObjectId`类型(默认) - 手动生成主键:`newObjectId = ObjectId()` - 自增主键:自己编程实现 ##### `GridFS` 存储超过16M的文件,如:图片、音频、视频等 `GridFS`会将大文件切分为多个小的`trunk`(文件片段,一般256k/个) ,每个trunk作为一个`document`被存储到`collection`中