MongoDB-CN-Manual
  • MongoDB中文手册|官方文档中文版
  • MongoDB用户手册说明
  • MongoDB简介
    • 入门
    • 数据库和集合
      • 视图
      • 按需物化视图
      • 封顶集合
      • 时间序列集合
    • 文档
    • BSON类型
      • Comparison and Sort Order
      • MongoDB Extended JSON (v2)
      • MongoDB Extended JSON (v1)
  • 安装 MongoDB
    • 安装MongoDB社区版
      • 在Linux上安装MongoDB社区版
      • 在macOS上安装MongoDB社区版
      • 在Windows上安装MongoDB社区版
    • 安装MongoDB企业版
      • 在Linux上安装MongoDB企业版
      • 在Mac OS安装MongoDB企业版
      • 在Windows安装MongoDB企业版
      • 使用Docker安装MongoDB企业版
    • 将社区版MongoDB升级到企业版MongoDB
    • 验证MongoDB软件包的完整性
  • The mongo Shell
    • 配置mongo Shell
    • 使用 mongo Shell帮助
    • 为mongo Shell编写脚本
    • mongo Shell中的数据类型
    • mongo Shell 快速参考
  • MongoDB CRUD操作
    • 插入文档
      • 插入方法
    • 查询文档
      • 在mongo Shell中迭代游标
      • 从查询返回的项目字段
      • 查询嵌入式文档数组
      • 查询数组
      • 查询空字段或缺少字段
      • 查询嵌入/嵌套文档
    • 更新文档
      • 更新方法
      • 聚合管道更新
    • 删除文档
      • 删除方法
    • 地理空间查询
      • 用地理空间查询查找餐馆
      • GeoJSON对象
    • 批量写入操作
    • 可重试写入
    • 可重试读取
    • SQL到MongoDB的映射图表
    • 文本搜索
      • 文本索引
      • 文本索引操作
      • 集合管道中的文本索引
      • 文本索引语言
    • Read Concern读关注
      • 读关注 "local"
      • 读关注 "available"
      • 读关注 "majority"
      • 读关注 "linearizable"
      • 读关注 "snapshot"
    • Write Concern写关注
    • MongoDB CRUD概念
      • 原子性和事务
      • 读隔离性,一致性和近因性
        • 因果一致性和读写关注
      • 分布式查询
      • 通过findAndModify进行线性化读取
      • 查询计划
      • 查询优化
        • 评估当前操作性能
        • 优化查询性能
        • 写操作性能
        • 说明结果
      • 分析查询表现
      • Tailable 游标
  • MongoDB聚合
    • 聚合管道
      • 聚合管道优化
      • 聚合管道限制
      • 聚合管道和分片集合
      • 使用 Zip Code 数据集进行聚合
      • 使用用户首选项数据进行聚合
    • Map-Reduce
      • Map-Reduce 和分片集合
      • Map-Reduce 并发
      • Map-Reduce 示例
      • 执行增量 Map-Reduce
      • 对 Map Function 进行故障排除
      • 排除 Reduce Function 问题
      • Map-Reduce转换到聚合管道
    • 聚合参考
      • 聚合管道快速参考
      • 聚合命令
      • 聚合命令对比
      • 聚合表达式中的变量
      • SQL 到聚合映射图表
  • MongoDB数据模型
    • 数据建模介绍
    • 模式验证
    • 数据模型设计
      • 一对一嵌套关系模型
  • MongoDB事务
  • MongoDB事务
    • 驱动程序 API
    • 生产注意事项
    • 生产注意事项 (分片集群)
    • 事务操作
  • MongoDB索引
    • 单字段索引
    • 复合索引
    • 多键索引
      • 多键索引范围
    • 文本索引
      • 为文本索引指定语言
      • 指定文本索引的名称
      • 用权重控制搜索结果
      • 限制扫描条目的数量
    • 通配符索引
      • 通配符索引限制
    • 2dsphere 索引
      • 查询一个2dsphere索引
    • 2d 索引
      • 创建一个2d索引
      • 查询一个2d索引
      • 2d索引内部
      • 使用球面几何计算距离
    • geoHaystack 索引
      • 创建Haystack索引
      • 查询Haystack索引
    • 哈希索引
    • 索引特性
      • TTL 索引
        • 通过设置TTL使集合中的数据过期
      • 唯一索引
      • 部分索引
      • 不分大小写索引
      • Sparse 索引
    • 在填充的集合上建立索引
      • 在副本集上建立滚动索引
      • 在分片群集上建立滚动索引
    • 索引交集
    • 管理索引
    • 衡量索引使用
    • 索引策略
      • 创建索引来支持查询
      • 使用索引对查询结果进行排序
      • 确保索引适合RAM
      • 创建以确保选择性的查询
    • 索引参考
  • MongoDB安全
    • 安全检查列表
    • 启用访问控制
    • 身份验证
      • 用户
        • 添加用户
        • 权限认证机制
          • SCRAM
            • 用x.509证书来认证客户端
    • 审计
      • 配置审计过滤器
      • 配置审计
      • 系统事件审计消息
    • 网络和配置强化
    • 安全参考
      • system.roles集合
      • system.users集合
      • 资源文档
      • 权限操作
    • 附录
      • 附录-A-用于测试的 OpenSSl CA 证书
      • 附录-B-用于测试的OpenSSL服务器证书
      • 附录-C-用于测试的OpenSSL客户端证书
  • Change Streams变更流
    • 变更流生产建议
    • 变更事件
  • MongoDB复制
    • 副本集成员
    • 副本集日志
    • 副本集数据同步
    • 副本集部署架构
    • 副本集成员配置教程
    • 副本集维护教程
    • MongoDB复制参考
  • MongoDB分片
    • 分片集群组件
    • 分片键
    • 哈希分片
    • 范围分片
    • 区
      • 管理分片区
      • 按位置细分数据
      • 用于更改SLA或SLO的分层硬件
      • 按应用或客户细分数据
      • 仅插入工作负载的分布式本地写入
      • 管理分片区
    • 使用块进行数据分区
      • 在分片集群中拆分数据块
    • 分片管理
      • 查看集群设置
    • 重启一个分片集群
    • [把一个分片集群迁移到不同的硬件](fen-pian/migrate-a -sharded-cluster-to-different-hardware.md)
    • 分片参考
  • MongoDB管理
    • 产品说明
    • 操作检查列表
    • 开发检查列表
    • 配置和维护
    • 性能
    • 数据中心意识
      • MongoDB部署中的工作负载隔离
      • 区
        • 管理分片区
        • 按位置细分数据
        • 用于更改SLA或SLO的分层硬件
        • 按应用或客户细分数据
        • 仅插入工作负载的分布式本地写入
        • 管理分片区
    • MongoDB备份方法
    • MongoDB监控
  • MongoDB存储
    • 存储引擎
      • WiredTiger 存储引擎
      • 内存存储引擎
    • 日志记录
      • 管理日志记录
        • GridFS
        • FAQ:MongoDB 存储
  • MongoDB参考
    • 运算符
      • 查询与映射运算符
        • 比较查询运算符
          • $eq
          • $gt
          • $gte
          • $in
          • $lt
          • $lte
          • $ne
          • $nin
        • 逻辑查询运算符
          • $and
          • $not
          • $nor
          • $or
        • 元素查询运算符
        • 评估查询运算符
        • 地理空间查询运算符
        • 数组查询运算符
        • 按位查询运算符
        • $comment
        • 映射运算符
      • 更新运算符
        • 字段更新运算符
        • 数组更新运算符
        • 按位更新运算符
      • 聚合管道阶段
      • 聚合管道操作符
        • $abs (aggregation)
        • $acos (aggregation)
        • $acosh (aggregation)
        • $add (aggregation)
        • $addToSet (aggregation)
        • $allElementsTrue (aggregation)
        • $and (aggregation)
        • $anyElementTrue (aggregation)
        • $arrayElemAt (aggregation)
        • $arrayToObject (aggregation)
        • $asin (aggregation)
        • $asinh (aggregation)
        • $atan (aggregation)
        • $atan2 (aggregation)
        • $atanh (aggregation)
        • $avg (aggregation)
        • $ceil (aggregation)
        • $cmp (aggregation)
        • $concat (aggregation)
        • $concatArrays (aggregation)
        • $cond (aggregation)
        • $convert (aggregation)
        • $cos (aggregation)
        • $dateFromParts (aggregation)
        • $dateToParts (aggregation)
        • $dateFromString (aggregation)
        • $literal (aggregation)
      • 查询修饰符
    • 数据库命令
      • 聚合命令
      • 地理空间命令
      • 查询和写操作命令
      • 查询计划缓存命令
      • 认证命令
      • 用户管理命令
      • 角色管理命令
      • 复制命令
      • 分片命令
      • 会话命令
      • 管理命令
      • 诊断命令
      • 免费监控命令
      • 系统事件审计命令
    • mongo Shell 方法
      • 集合方法
        • db.collection.aggregate()
        • db.collection.bulkWrite()
        • db.collection.copyTo()
        • db.collection.count()
        • db.collection.countDocuments()
        • db.collection.estimatedDocumentCount()
        • db.collection.createIndex()
        • db.collection.createIndexes()
        • db.collection.dataSize()
        • db.collection.deleteOne()
        • db.collection.deleteMany()
        • db.collection.distinct()
        • db.collection.drop()
        • db.collection.dropIndex()
        • db.collection.dropIndexes()
        • db.collection.ensureIndex()
        • db.collection.explain()
        • db.collection.find()
        • db.collection.findAndModify()
        • db.collection.findOne()
        • db.collection.findOneAndDelete()
        • db.collection.findOneAndReplace()
        • db.collection.findOneAndUpdate()
        • db.collection.getIndexes()
        • db.collection.getShardDistribution()
        • db.collection.getShardVersion()
        • db.collection.insert()
        • db.collection.insertOne()
        • db.collection.insertMany()
        • db.collection.isCapped()
        • db.collection.latencyStats()
        • db.collection.mapReduce()
        • db.collection.reIndex()
        • db.collection.remove()
        • db.collection.renameCollection()
        • db.collection.replaceOne()
        • db.collection.save()
        • db.collection.stats()
        • db.collection.storageSize()
        • db.collection.totalIndexSize()
        • db.collection.totalSize()
        • db.collection.update()
        • db.collection.updateOne()
        • db.collection.updateMany()
        • db.collection.watch()
        • db.collection.validate()
    • MongoDB中的限制与阈值
    • MongoDB系统集合
    • 词汇表
    • 默认的MongoDB端口
    • 默认的MongoDB读/写关注
    • 服务器会话
  • MongoDB FAQ
    • FAQ: MongoDB基础知识
    • FAQ: MongoDB索引
    • FAQ: MongoDB并发
    • FAQ: MongoDB分片
    • FAQ: MongoDB复制和副本集
    • FAQ: MongoDB存储
    • FAQ: MongoDB诊断
  • MongoDB 版本管理
  • 联系我们
    • Tapdata Cloud
    • MongoDB中文社区
    • 社区合作伙伴—锦木信息
由 GitBook 提供支持
在本页
  • MongoDB使用哪种类型的锁定?
  • MongoDB中锁的粒度有多细?¶
  • 如何查看mongod实例上的锁状态?¶
  • 读或写操作是否会产生锁定?¶
  • 一些常见的客户端操作会采取什么锁定?
  • 哪些管理命令可以锁定数据库?
  • 哪些管理命令可以锁定集合?¶
  • MongoDB操作是否可以锁定多个数据库?
  • 分片如何影响并发性?¶
  • 并发性如何影响副本集上的主节点?¶
  • 并发如何影响副本集的从节点?¶
  • MongoDB是否支持事务?
  • MongoDB提供什么隔离保证?
  1. MongoDB FAQ

FAQ: MongoDB并发

上一页FAQ: MongoDB索引下一页FAQ: MongoDB分片

最后更新于3年前

在本页面

  • 实例?

MongoDB允许多个客户端读取和写入相同的数据。为了确保一致性,它使用锁定和其他 措施来防止多个客户端同时修改同一数据。这些机制共同保证了对单个文档的所有写入全部发生或完全不发生,并且客户端永远不会看到不一致的数据视图。

MongoDB使用哪种类型的锁定?

MongoDB使用读-写锁,允许并发的读写操作以共享的方式访问资源(例如数据库或集合)。

例如,当锁定用于写的集合(使用排它X锁定模式)时,必须同时在意向排他(IX)锁定模式下锁定相应的数据库锁和全局锁。单个数据库可以同时在IS和IX模式下锁定,但是独占(X)锁不能与任何其他模式共存,共享(S)锁只能与意向共享(IS)锁共存。

锁是公平的,读取和写入按顺序排队。但是,为了优化吞吐量,当一个请求被授予时,所有其他兼容请求将同时被授予,从而有可能在冲突请求之前释放它们。例如,考虑X锁(排它锁)被释放的情况,并且冲突队列包含以下各项:

IS → IS → X → X → S → IS

在严格的先进先出(FIFO)顺序中,将仅授予前两个IS模式。相反,MongoDB实际上将授予所有IS和S模式,一旦它们全部完成,它将授予X,即使在此期间新的IS或S请求已进入排队。由于授予将始终将所有其他请求移到队列中,因此任何请求都不会存在饿死等待问题。

锁模式
Description

R

代表共享锁(S)

W

代表排它锁(X)

r

代表意向共享锁 (IS)

w

代表意向排它锁 (IX)

对于大多数读取和写入操作,WiredTiger使用乐观并发控制。WiredTiger仅在全局,数据库和集合级别使用意向锁。当存储引擎检测到两个操作之间存在冲突时,将引发写冲突,从而导致MongoDB对用户而言透明地重试该操作。

要报告有关锁的锁使用率信息,请使用以下任何一种方法:

锁定模式
描述

R

表示共享(S)锁。

W

表示排他(X)锁。

r

表示共享意图(IS)锁。

w

表示意向排他(IX)锁。

在某些情况下,读和写操作可以产生它持有的锁。

  • 避免长时间执行的存储性事务,因为这些事务可能需要在内存中保存大量数据;

  • 作为中断响应点(interruption points),以便您可以取消长时间运行的操作;

  • 允许需要排他访问集合的操作,例如索引/集合删除和创建。

一些常见的客户端操作会采取什么锁定?

下表列出了一些操作以及它们用于文档级锁定存储引擎的锁定类型:

操作
数据库
集合级别锁

发出查询

r (意向共享)

r (意向共享)

插入资料

w (意向排他)

w (意向排他)

删除资料

w (意向排他)

w (意向排他)

更新数据

w (意向排他)

w (意向排他)

执行聚合操作

r (意向共享)

r (意向共享)

创建索引(前台)

W (排他)

创建索引(后台)

w (意向排他)

w (意向排他)

列出集合列表

r (意向共享)在版本4.0中更改。

映射减少操作

W(排他)和R(共享)

w(意向排他)和r(意向共享)

哪些管理命令可以锁定数据库?

以下管理操作需要在数据库级别上长时间进行排他锁定:

运作方式
方法

以下管理操作将锁定数据库,但仅在很短的时间内保持锁定:

运作方式
方法

也可以看看

在版本4.2中进行了更改。

以下管理操作需要在集合级别具有排他锁定:

运作方式
方法

_在版本4.2中进行了更改。_对于MongoDB 4.2.2和更高版本,这些操作在集合上获得排他(W)锁,并在集合上阻止其他操作,直到完成。对于MongoDB 4.0.0到4.2.1,这些操作采用全局排他(W)锁定并阻止其他操作,直到完成。

在MongoDB 4.2之前的版本,以上命令操作了对数据库的排他锁,阻止所有数据库操作_和_它的汇集,直到操作完成。

MongoDB操作是否可以锁定多个数据库?

以下MongoDB操作可能会在多个数据库上获得并持有锁:

运作方式
方法

此操作获得全局(W)排他锁,并阻止其他操作,直到完成为止。

_在版本4.2中进行了更改。_对于MongoDB 4.0.0到4.2.1,这些操作采用全局排他(W)锁定并阻止其他操作,直到完成。从MongoDB 4.2.2开始,这些操作仅获得排他(W)集合锁,而不是全局排他锁。在MongoDB 4.0之前,这些操作获得了排他(W)数据库锁。

_在版本4.2中进行了更改。_对于MongoDB 4.2.1和更早版本,此操作在重命名数据库之间的集合时会获得全局排他(W)锁,并阻止其他操作直到完成。从MongoDB 4.2.2开始,此操作仅在目标数据库上获得互斥(W)锁定,在源数据库上获得意向共享(r)锁定,并在源集合上获得共享(S)锁定,而不是全局排他锁。

MongoDB是否支持事务?

由于单个文档可以包含关联数据(译者注:通过内嵌文档或数组的方式),否则它们将在关系模式中的各个父子表之间建模,因此MongoDB的单文档原子操作已经提供了满足大多数应用程序数据完整性需求的事务语义。可以在单个操作中写入一个或多个字段,包括对多个子文档和数组元素的更新。MongoDB提供的保证可确保在文档更新时完全隔离。任何错误都会导致操作回滚,以使客户端获得一致的文档视图。

但是,对于需要对多个文档(在单个或多个集合中)进行读写原子性的情况,MongoDB支持多文档事务:

  • 在版本4.0中,MongoDB支持副本集上的多文档事务。

  • 在版本4.2中,MongoDB引入了分布式事务,它增加了对分片群集上多文档事务的支持,并合并了对副本集上多文档事务的现有支持。

重要

MongoDB提供什么隔离保证?

有关信息,请参阅:

译者:钟秋

update:小芒果

MongoDB使用多粒度锁定,它允许操作锁定在全局,数据库或集合级别,并允许各个存储引擎在集合级别以下实现自己的并发控制(例如,在WiredTiger中的文档级别)。

除了用于读取的共享(S)锁定模式和用于写操作的排他(X)锁定模式之外,意向共享(IS)和意向排他(IX)模式还表明使用更精细的锁定粒度来读取或写入资源的意图 。当以一定的粒度锁定时,所有更高级别的锁定都使用。

在和输出中,锁定模式表示如下:

有关更多信息,请参见Wikipedia页面上的 。

MongoDB中锁的粒度有多细?

一些全局操作(通常是涉及多个数据库的短暂操作)仍然需要全局“实例范围”锁定。其他一些操作(如)仍需要排他数据库锁。

如何查看实例上的锁状态?

,

,

,

,和/或

在或

具体而言,的文档或的字段可提供有关 实例中锁的类型和锁争用的数量。

在和输出中,锁定模式表示如下:

要终止操作,请使用。

读或写操作是否会产生锁定?

长时间运行的读写操作(例如查询,更新和删除)在许多情况下都会产生。MongoDB如果单个修改文档的操作,影响带有multi参数修改多个文档 操作,MongoDB也会产生锁定。

对于支持文档级存储引擎(例如,当使用意向锁访问存储时不需要锁定,因为该锁是数据库和集合级别的全局锁定,不会阻塞其他读取和写入操作。但是,操作将定期产生锁定,例如:

某些管理命令可以较长时间排他锁定数据库。在某些部署中,对于大型数据库,您可以考虑使实例脱机,以便客户端不受影响。例如,如果 是一部分,请执行脱机操作,让集合服务的其他成员请求负载。

_在版本4.2中进行了更改。如果在同一数据库中重命名集合,则该操作将对源集合和目标集合进行排他(W)锁定。在MongoDB 4.2之前的版本中,在同一数据库中重命名时,该操作将对数据库使用排他(W)锁。(仅)如果目标名称空间与源集合位于不同的数据库中,则锁定行为取决于版本:(MongoDB 4.2.2和更高版本)在跨数据库重命名集合时,该操作在目标数据库上获得排他(W)锁,并阻塞该数据库上的其他操作,直到操作完成。(MongoDB 4.2.1和更早版本)_在跨数据库重命名集合时,该操作采用全局排他(W)锁,并阻止其他操作,直到操作完成。

哪些管理命令可以锁定集合?

_在版本4.2中进行了更改。_如果在同一数据库中重命名集合,则该操作将对源集合和目标集合进行排他(W)锁定。在MongoDB 4.2之前的版本中,在同一数据库中重命名时,该操作将对数据库使用排他(W)锁。(仅)如果目标名称空间与源集合位于不同的数据库中,则锁定行为取决于版本:MongoDB 4.2.2及更高版本_在跨数据库重命名集合时,_该操作将对目标数据库进行排他(W)锁定,并阻塞该数据库上的其他操作,直到操作完成。_MongoDB 4.2.1和更早版本_在跨数据库重命名集合时,该操作将使用全局排他(W)锁,并阻止其他操作,直到操作完成。

_在版本4.2中进行了更改。_对于MongoDB 4.2.2及更高版本,此操作对集合进行排他(W)锁定,并阻止对集合的其他操作,直到完成。对于MongoDB 4.2.1和更早版本,此操作采用全局排他(W)锁定并阻止其他操作,直到完成。

_在版本4.2中进行了更改。_对于MongoDB 4.2.1和更早版本,此操作获得全局排他(W)锁并阻止其他操作,直到完成。从MongoDB 4.2.2开始,此操作仅在 集合上获得排他(W)锁,而不是全局排他锁。

分片如何影响并发性?

[分片通过将集合分布在多个实例,提高并发的能力,允许分片服务器(即进程)来并发地执行针对下游 实例的任意数量的操作。

在分片群集中,锁适用于每个单独的分片,而不适用于整个群集。也就是说,每个实例都独立于分片群集中的其他实例,并使用自己的 。一个 实例上的操作不会阻止任何其他实例上的操作。

并发性如何影响副本集上的主节点?

对于副本集,当MongoDB写入上的集合时 ,MongoDB还将写入主节点上的-local数据库中的特殊集合。因此,MongoDB必须同时锁定集合所在的数据库和local 数据库。必须同时锁定这两个库保持数据库一致,并确保写入操作,甚至包括复制,是“全有或全无”的操作。

写入,锁的范围适用于。

并发如何影响副本集的从节点?

在进行副本集时,MongoDB不会将写入连续的应用到 。从节点批量收集oplog记录,然后并行应用这些批处理。从节点将按照出现在操作日志中的顺序应用写入操作。

从MongoDB 4.0开始,如果从节点正在复制,则读取从数据的快照读取的 数据。这允许读取与复制同时进行,同时仍保证数据的一致视图。在MongoDB 4.0之前的版本中,将在所有正在进行的复制完成之前阻止对从节点的读取操作。有关更多信息,请参见。

有关MongoDB中事务的详细信息,请参阅 页面。

在大多数情况下,与单文档写入相比,多文档事务产生的性能成本更高,并且多文档事务的可用性不应代替高效的模式设计。在许多情况下, 将继续是您的数据和用例的最佳选择。也就是说,在许多情况下,对数据进行适当的建模将最大程度地减少对多文档事务的需求。

有关其他事务使用方面的注意事项(例如运行时限制和oplog大小限制),另请参见 。

根据读取的关注点,客户端可以在写入之前看到写入结果。要控制是否可以回滚读取的数据,客户端可以使用该readConcern选项。

原文链接:

MongoDB使用哪种类型的锁定?
MongoDB中中锁的粒度有多细?
如何查看
mongod
上锁的状态
读或写操作是否会产生锁定?
一些常见的客户端操作会采取什么锁定?
哪些管理命令可以锁定数据库?
哪些管理命令可以锁定集合?
MongoDB操作是否可以锁定多个数据库?
分片如何影响并发?
并发性如何影响副本集的主节点?
并发如何影响副本集的从节点?
MongoDB是否支持事务?
MongoDB提供什么隔离保证?
并发控制
[1]
意向锁来锁定
db.serverStatus()
db.currentOp()
¶
collMod
mongod
¶
db.serverStatus()
db.currentOp()
mongotop
mongostat
MongoDB Cloud Manager
Ops Manager,MongoDB企业版提供的先进的解决方案
serverStatus输出中
locks
当前操作报告中
mongod
db.serverStatus()
db.currentOp()
db.killOp()
¶
update()
并发控制的
WiredTiger)
mongod
mongod
副本集的
mongod
MongoDB操作是否可以锁定多个数据库?
¶
¶
mongod
mongos
mongod
mongod
锁
mongod
¶
主节点
oplog
mongod
副本集时
主节点
¶
复制同步
从节点
WiredTiger
目标从节点
多线程复制
事务
非规范化数据模型(嵌入式文档和数组)
生产注意事项
持久
读取隔离,一致性和因近原则
原子性和事务
读关注
https://docs.mongodb.com/manual/faq/concurrency/
[1]
多粒度锁定
cloneCollectionAsCapped
collMod
compact
convertToCapped
renameCollection
db.collection.renameCollection()
renameCollection
authenticate
db.auth()
createUser
db.createUser()
create
db.createCollection()
db.createView()
createIndexes
db.collection.createIndex()
db.collection.createIndexes()
drop
db.collection.drop()
dropIndexes
db.collection.dropIndex()
db.collection.dropIndexes()
renameCollection
db.collection.renameCollection()
renameCollection
reIndex
db.collection.reIndex()
replSetResizeOplog
oplog
db.copyDatabase()
reIndex
db.collection.reIndex()
renameCollection
replSetResizeOplog
oplog