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 提供支持
在本页
  • 阅读关注级别
  • ReadConcern 支持
  • 读关注选项
  • 事务和可用的读关注
  • 重要
  • 注意事项
  • 读自己的文章
  • 实时顺序
  • 性能比较
  • 读操作和afterClusterTime
  1. MongoDB CRUD操作

Read Concern读关注

上一页文本索引语言下一页读关注 "local"

最后更新于3年前

在本页面

读关注 选项允许你控制从复制集和分片集群读取数据的一致性和隔离性。

通过有效地使用和读关注,你可以适当地调整一致性和可用性的保证级别,例如等待以保证更强的一致性,或放松一致性要求以提供更高的可用性。

将MongoDB驱动程序更新到MongoDB 3.2或更高版本以支持读关注。

阅读关注级别

以下为可用的读关注级别:

level

Description

无论级别如何,节点上的最新数据都可能无法反映系统中数据的最新版本

有关每个阅读关注级别的更多信息,请参见:

ReadConcern 支持

读关注选项

readConcern: { level: <level> }
db.collection.find().readConcern(<level>)

事务和可用的读关注

重要

你可以在事务开始时设置读关注:

如果未在事务开始时指定,则事务将使用会话级的读关注,或者如果未设置,则使用客户端级的读关注。

因果一致的会话和阅读相关的担忧

支持读关注的操作

下列的操作支持读关注:

重要

命令/方法

✓

✓

✓

✓

✓

✓

✓

✓

✓

✓

✓

✓

✓

✓

✓

✓

✓

✓

✓

✓

✓

✓

✓

✓

✓

✓

✓

✓

✓

✓

✓

✓

✓

✓

下列的写操作页能接受读关注,但必须是多文档事务的一部分:

重要

在为事务中的操作设置读关注时,请在事务级别而不是在单个操作级别设置读关注

Command 命令

✓

✓

✓

✓

✓

✓

✓

✓

[3]

注意事项

读自己的文章

在版本3.6中更改

实时顺序

性能比较

为了避免万一大多数数据承载成员不可用,请始终将 maxTimeMS 与可线性化的读确认一起使用。maxTimeMS 确保操作不会无限期地阻塞,而是确保如果无法满足读取要求,则操作将返回错误。

例如:

db.restaurants.find( { _id: 5 } ).readConcern("linearizable").maxTimeMS(10000)
db.runCommand( {
     find: "restaurants",
     filter: { _id: 5 },
     readConcern: { level: "linearizable" },
     maxTimeMS: 10000
} )

读操作和afterClusterTime

3.6 版本新加入

[warning] 重要

使用指定的 afterClusterTime 的读操作将返回满足读关注级别要求和指定的 afterClusterTime 要求的数据。

对于与因果一致会话无关的读操作,未设置 afterClusterTime。

阅读问题出处

下表显示了可能的阅读问题provenance值及其重要性:

出处
描述

clientSupplied

read关注点是在应用程序中指定的。

customDefault

implicitDefault

在没有其他所有读取关注规范的情况下,读取关注源自服务器。

译者:杨帅 张琦

校对:杨帅

查询并从实例返回数据,但不能保证该数据已被写入大多数副本集成员(即可能已经回滚)。 默认为: 针对主节点读。 如果读取与因果一致的会话相关联,则针对副节点读。 **可用性:**读关注local可用于有或没有和事务中。 更多的信息,请参考页

查询并从实例返回数据,但不能保证该数据已被写入大多数副本集成员(即可能已经回滚)。 **默认为:**如果读取与没有关联,则针对副节点读 **可用性:**读关注available无法用于有因果关系一致的会话和事务中。 对于分片群集,读关注提供了各种读关注中尽可能最低的延迟。但是,这是以牺牲一致性为代价的,因为从分片的集合中进行读取时,读关注会返回。为了避免从分片的集合中读取时返回孤立文档的风险,可使用其他读关注,如读关注。 更多的信息,请参考页 3.6版本的新功能

为了满足读关注“majority”,副本集成员从其内存视图中返回多数提交点提交的数据。这样,读关注在性能成本上可与其他读关注相媲美。 可用性: 读关注可用于有或没有因果关系一致的会话和事务中。 对于具有三名成员的主从仲裁(PSA)架构的部署,可以禁用读关注;但是,这对change streams(仅在MongoDB 4.0和更早版本中)和分片群集上的事务有影响。有关更多信息,请参见.。 **要求:**若要使用的级别,副本集必须使用WiredTiger存储引擎。 注意: 对于中的操作,仅当事务以提交时,读关注才提供其保证。否则,读关注不能保证其在事务中读取的数据。 更多的信息,请参考页

该查询返回的数据表示了这些数据在操作开始之前已成功在大多数节点确认写入。查询可能会等待并发执行的写操作传播到大多数副本集成员,然后返回结果。 如果大多数副本集成员崩溃并在读操作后重新启动,则如果将设置为默认状态true,则读操作返回的文档将还是有效的。 将设置为false时,MongoDB不会等待在确认写入之前先要写入磁盘日志。这样,如果给定副本集中大多数节点的瞬时丢失(例如崩溃和重新启动),majority写操作可能会回滚。 可用性: 读关注不适用于因果一致的会话和事务。 你可以仅对主节点上的读操作指定为线性读关注。 你不能将或操作与读关注结合使用。也就是说,如果为指定为读关注,则不能在管道中使用任何的操作。 **要求:**linearizable读关注仅保证在读操作指定了唯一标识单个文档的查询过滤器时可用。 请始终将maxTimeMS与linearizable读关注一起使用,以防止大多数数据承载成员不可用。maxTimeMS确保操作不会无限期地阻塞,而是确保如果无法满足读取要求,则操作将返回错误。 更多的信息,请参考页

如果事务不是的一部分,写关注为且在事务提交后,可以确保事务操作已从多数提交数据的快照中读取。 如果事务是的一部分,写关注为且在事务提交后,可以确保事务操作已从多数提交数据的快照中读取,该快照提供了与紧接事务开始之前的操作的因果一致性。 读关注仅可用于多文档事务。 对于分片群集上的事务,如果事务中的任何操作涉及的分片,那你就不能对该事务使用读关注。你只能对事务使用读关注或。

对于不在中的操作,你可以将 readConcern 级别指定为一个命令和方法的选项:

要为 shell方法 指定阅读关注级别,请使用 方法:

对于,应在事务级别而不是在单个操作级别设置读关注。事务中的操作将使用事务级别的读关注。事务内部将忽略在集合和数据库级别设置的任何读关注。如果显式指定了事务级别的读关注点,则在事务内部也将忽略客户端级别的读关注点。

不要为各个操作明确设置读关注。要设置事务的读关注,请参阅读 。

对于多文档事务,读关注级别, 和 是可用的。

中的写命令可以支持事务级别的读关注。

有关等多信息,请参考 .

对于在中的操作, h和 级别可用。但是,为了保证因果一致性,你必须使用 。有关详细信息,请参见 。

如果多文档事务与因果一致的会话相关联,则 也可用于该事务。

在为事务中的操作设置读关注时,请在事务级别而不是在单个操作级别设置读关注。不要在事务中明确的设置单独操作的读关注。更多信息,查看

via

你不能将 或者 阶段与读关注的结合使用。也就是说,如果为指定读关注,则不能在管道中包括任何一个阶段。

读关注仅适用于多文档事务。在事务中,不能在分片集合上使用distinct命令或其协助命令。

(, _)_读关注仅适用于多文档事务,并且对于事务,您可以在事务级别设置读关注。支持的操作对应于事务中可用的CRUD操作。有关更多信息,请参见

从MongoDB 3.6版本开始,如果写请求确认,你可以使用读你自己写入的内容。

在MongoDB 3.6之前,您必须使用 { w: "majority" } 写关注发出写操作,然后对读操作使用 或者 读关注,以确保单个线程可以读取自己的写入内容

结合 写关注, 读关注使多个线程可以在单个文档上执行读写操作,就好像单个线程实时地执行了这些操作一样。 也就是说,这些读写的对应的计划被认为是线性的。

与不同, 的读关注通过从节点确认读操作正在从主节点读,该操作能够以写关注来确认写入。 因此,具有线性化读关注的读取可能比具有 或 读关注的读慢得多。

在下,副本集中的两个节点可能会短暂地认为它们是主节点,但至多,其中一个节点将能够以写关注完成。 可以完成写入的节点是当前主节点,另一个节点是前主节点,由于的原因,该主节点尚未意识到其降级。 发生这种情况时,尽管请求的读优先级为,但连接到前主界定啊的客户端仍可能会读到过时的数据,并且最终将对前主节点新写入的进行回滚。

MongoDB 3.6引入了对的支持。 对于与因果一致的会话相关联的读操作,MongoDB 3.6引入了 afterClusterTime 读关注选项,驱动程序会自动将afterClusterTime 读关注选项设置为与因果一致的会话相关联的操作。

不要手动为读操作设置 afterClusterTime 。 MongoDB驱动程序会针对与因果一致的会话相关联的操作自动设置此值。 但是,您可以提前会话的操作时间和群集时间,以便与另一个客户端会话的操作保持一致。 有关示例,请参见。

为了满足 afterClusterTime 值为T的读请求, 必须在其oplog到达时间T之后执行请求。如果其oplog尚未达到时间T,则 必须等待服务该请求。

从4.4版本开始,MongoDB跟踪阅读关注来源,表示某个特定读取关注点的来源。您可能会在指标、读取关注错误对象和MongoDB日志中看到出处。

读取关注点源自自定义的默认值。 参见 .

读关注 "local"
读关注 "available"
读关注 "majority"
读关注 "linearizable"
读关注 "snapshot"
多文档事务
mongo
db.collection.find()
cursor.readConcern()
多文档事务
Read Concern/Write Concern/Read Preference
"snapshot"
"local"
"majority"
多文档事务
事务的读关注
因果一致的会话
"local"
"majority"
"majority"
因果一致性
"snapshot"
事务和读关注
因果一致的会话
"majority"
"linearizable"
"majority"
"linearizable"
"majority"
"linearizable"
{ w: "majority" }
[4]
"majority"
"local"
因果一致会话
示例
mongod
mongod
getLastError
写关注
读关注
读关注级别
ReadConcern 支持
注意事项
"local"
因果关系一致的会话
"local"
"available"
因果关系一致的会话
"available"
"available"
孤立的文档
"local"
"available"
"majority"
"majority"
"majority"
"majority"
禁用读关注Marjority
"majority"
读关注
多文档事务
写关注"majority"
"majority"
"majority"
"majority"
"linearizable"
writeConcernMajorityJournalDefault
writeConcernMajorityJournalDefault
w: "majority"
"linearizable"
$out
$merge
"linearizable"
db.collection.aggregate()
"linearizable"
"linearizable"
"snapshot"
因果一致会话
"majority"
因果一致会话
"majority"
"snapshot"
已被禁用读关注“majority”
"snapshot"
"local"
"majority"
"local"
"available"
"majority"
"snapshot"
"linearizable"
count
distinct
find
db.collection.find()
cursor.readConcern()
geoSearch
getMore
aggregate
db.collection.aggregate()
Session.startTransaction()
[1]
$out
$merge
"linearizable"
db.collection.aggregate()
"linearizable"
[2]
"snapshot"
"local"
"available"
"majority"
"snapshot"
"linearizable"
delete
db.collection.deleteMany()
db.collection.deleteOne()
db.collection.remove()
findAndModify
db.collection.findAndModify()
db.collection.findOneAndDelete()
db.collection.findOneAndReplace()
db.collection.findOneAndUpdate()
insert
db.collection.insert()
db.collection.insertOne()
db.collection.insertMany()
update
db.collection.update()
db.collection.updateMany()
db.collection.updateOne()
db.collection.replaceOne()
1
2
“SNAPSHOT”
“SNAPSHOT”
事务和读关注
[4]
某些情况
{ w: "majority" }
{ w: "majority" }
网络分区
主节点
setDefaultRWConcern