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 提供支持
在本页
  • 前提条件
  • 支持的部署Topologie
  • 支持的存储引擎
  • 3.6+ MongoDB驱动程序
  • MongoDB版本
  • 写确认书
  • 可重试写入和多文档交易
  • 启用可重试写入
  • MongoDB驱动程序
  • 可重试的写操作
  • 行为
  • 持续的网络错误
  • 故障转移期
  • Upsert上的重复键错误
  • 诊断程序
  1. MongoDB CRUD操作

可重试写入

上一页批量写入操作下一页可重试读取

最后更新于3年前

在本页面

3.6版的新功能

可重试写入允许MongoDB驱动程序在遇到网络错误或在复制集或分片群集中找不到正常的主操作时自动重试特定的写操作一次。

前提条件

可重试写入具有以下要求:

支持的部署Topologie

​ 可重试写入需要 或,并且不支持独立实例。

支持的存储引擎

​ 可重试写入需要支持文档级锁定的存储引擎,例如或 存储引擎。

3.6+ MongoDB驱动程序

客户端需要为MongoDB 3.6或更高版本更新的MongoDB驱动程序:

Java 3.6+ Python 3.6+ C 1.9+
C# 2.5+ Node 3.0+ Ruby 2.5+
Perl 2.0+ PHPC 1.4+ Scala 2.2+

MongoDB版本

写确认书

可重试写入和多文档交易

版本4.0中的新功能

启用可重试写入

MongoDB驱动程序

Mongo shell

mongo --retryWrites

可重试的写操作

[success] Note

事务中的写操作不能单独重试。

方法
说明

插入操作

单文档更新操作。

单个文档删除操作

findAndModify操作。所有findAndModify操作都是单个文档操作。

只包含单文档写操作的批量写操作。可重试的大容量操作可以包括指定的写操作的任何组合,但不能包括任何多文档写操作,比如updateMany。

仅由单文档写操作组成的批量写操作。可重试的大容量操作可以包括指定的写操作的任何组合,但不能包括任何多文档写操作,比如update,它为multi选项指定true。

分片键值更新

  • 在MongoDB 4.2之前,MongoDB不会重试遇到重复键错误的upsert操作。

行为

持续的网络错误

MongoDB可重试写只做一次重试尝试。这有助于解决暂时的网络错误和复制集选举,但不能解决持久的网络错误。

故障转移期

[warning] Warning

Upsert上的重复键错误

MongoDB 4.2将重试单文档的upsert操作(即:upsert: true和multi: false)由于重复的键错误而失败,只有当操作满足以下所有条件:

  • 目标集合具有导致重复键错误的唯一索引。

  • 更新匹配条件为:

    • 单个相等谓词

      { "fieldA" : "valueA" },

    • 相等谓词的逻辑

      { "fieldA" : "valueA", "fieldB" : "valueB" }

  • 唯一索引键模式中的字段集与更新查询谓词中的字段集匹配。

  • 更新操作不会修改查询谓词中的任何字段。

    下表包含服务器可以或不能在重复键错误时重试的upsert操作示例:

唯一索引键模式

更新操作

可重试

{ _id : 1 }

db.collName.updateOne( { _id : ObjectId("1aa1c1efb123f14aaa167aaa") }, { $set : { fieldA : 25 } }, { upsert : true } )

是

{ fieldA : 1 }

db.collName.updateOne( { fieldA : { $in : [ 25 ] } }, { $set : { fieldB : "someValue" } }, { upsert : true } )

是

{ fieldA:1, fieldB :1 }

db.collName.updateOne( { fieldA : 25, fieldB : "someValue" }, { $set : { fieldC : false } }, { upsert : true } )

是

{ fieldA : 1 }

db.collName.updateOne( { fieldA : { $lte : 25 } }, { $set : { fieldC : true } }, { upsert : true } )

没有 查询谓词fieldA不等于

{ fieldA : 1 }

db.collName.updateOne( { fieldA : { $in : [ 25 ] } }, { $set : { fieldA : 20 } }, { upsert : true } )

没有 更新操作修改查询谓词中指定的字段。

{ _id : 1 }

db.collName.updateOne( { fieldA : { $in : [ 25 ] } }, { $set : { fieldA : 20 } }, { upsert : true } )

没有 查询谓词字段集(fieldA)与索引关键字字段集()不匹配**_id**。

{ fieldA : 1 }

db.collName.updateOne( { fieldA : 25, fieldC : true }, { $set : { fieldD : false } }, { upsert : true } )

没有 这组查询谓词的字段(fieldA,fieldC)不匹配组索引键的字段(fieldA)

在MongoDB 4.2之前,MongoDB可重试写不支持由于重复的键错误而失败的重试更新。

诊断程序

版本3.6.3中的新功能

针对本地数据库的可重试写入

官方的MongoDB 4.2系列驱动程序默认情况下启用重试写入。 除非明确禁止重试写入,否则写入本地数据库的应用程序在升级到4.2系列驱动程序时将遇到写入错误。

译者:杨帅

校对:杨帅

集群中每个节点的MongoDB版本必须为3.6或更高,集群中每个节点的featureCompatibilityVersion必须为3.6或更高。有关featureCompatibilityVersion标志的更多信息,请参见。

为0的写操作是不可重试的。

是可重试的写操作。如果提交操作或中止操作遇到错误,MongoDB驱动程序将重试操作一次,而不管是否被设置为false。

有关交易的更多信息,请参见。

官方的MongoDB 3.6和4.0兼容驱动程序需要在连接字符串中包含选项,以启用该连接的可重试写操作。

官方的MongoDB 4.2兼容驱动程序在默认情况下启用了可重试写。升级到与4.2兼容的驱动程序,要求可重试写的应用程序可能会忽略选项。升级到与4.2兼容的驱动程序,要求禁用可重试写的应用程序必须在连接字符串中包含。

要在mongo shell中启用可重试写入,请使用命令行选项:

当发出已确认的写关注时,可以重试以下写操作; 例如,不能为**{w:0}**。

where multi is false

where justOne is true

具有以下写操作: . . . .

operations for: . . .

从MongoDB 4.2开始,您可以通过发布可重试写入或事务处理中的单文档update / findAndModify操作来更新文档的分片键值(除非分片键字段是不可变的**_id**字段)。 有关详细信息,请参见.。

MongoDB 4.2将重试遇到重复密钥异常的某些单文档upsert(更新使用upsert:true和multi:false)。 有关条件,请参阅 .

如果驱动程序在目标复制集中或分片集群分片中找不到正常的主服务器,则驱动程序在重试之前会等待毫秒来确定新的主服务器。可重试写操作不会处理故障转移周期超过的实例。

如果客户端应用程序在发出写操作后的时间超过,那么当客户端应用程序开始响应时(无需重新启动),可能会重试并再次应用写操作。

命令及其mongo shell帮助程序 在节中包含有关可重试写入的统计信息。

要禁用可重试写入,请在MongoDB集群的中指定 。

setFeatureCompatibilityVersion
Write Concern
事务提交和中止操作
retryWrites
Transactions
retryWrites=true
retryWrites=true
retryWrites=false
--retryWrites
Write Concern
更改文档的分片键值
Duplicate Key Errors on Upsert
serverSelectionTimeoutMS
serverSelectionTimeoutMS
localLogicalSessionTimeoutMinutes
serverStatus
db.serverStatus()
transactions
连接字符串
retryWrites=false
复制集
分片群集
WiredTiger
内存中
前提条件
可重试写入和多文档交易
启用可重试写入
可重试的写操作
行为
db.collection.insertOne()
db.collection.insert()
db.collection.insertMany()
db.collection.updateOne()
db.collection.replaceOne()
db.collection.save()
db.collection.update()
db.collection.deleteOne()
db.collection.remove()
db.collection.findAndModify()
db.collection.findOneAndDelete()
db.collection.findOneAndReplace()
db.collection.findOneAndUpdate()
db.collection.bulkWrite()
insertOne
updateOne
replaceOne
deleteOne
Bulk
Bulk.find.removeOne()
Bulk.find.replaceOne()
Bulk.find.replaceOne()