配置副本集上的操作
概述
在本指南中,您可以学习如何使用 写入关注、读取关注 和 读取偏好 配置来修改 MongoDB 在副本集上运行创建、读取、更新和删除(CRUD)操作的方式。
您可以在以下级别设置这些配置
客户端,除非覆盖,否则为所有操作执行设置默认值
事务
数据库
集合
上述列表按照优先级递增。例如,如果您在客户端和数据库级别都设置了读取关注,则数据库级别的读取关注将覆盖客户端级别的读取关注。
写入关注
写入关注指定在操作成功返回之前,从 MongoDB 获取写入操作确认的级别。未指定显式写入关注的操作将继承全局默认写入关注设置。
您可以通过以下方式设置写入关注writeConcern()
方法在客户端或事务上,或使用 withWriteConcern()
方法在数据库或集合上。
writeConcern()
和 withWriteConcern()
方法接受一个 WriteConcern
实例作为参数。您可以使用以下值之一来指定写入关注
WriteConcern.ACKNOWLEDGED
:写入操作在操作写入内存后返回。WriteConcern.W1
:写入操作仅在主节点确认写入操作后返回,而不等待从节点确认。WriteConcern.W2
:写入操作在主节点和至少一个从节点确认写入操作后返回。WriteConcern.W3
:写入操作在主节点和至少两个副节点确认写入操作后返回。WriteConcern.MAJORITY
:写入操作在副本集多数成员确认写入操作后返回。WriteConcern.UNACKNOWLEDGED
:写入操作在主节点处理写入操作后返回。WriteConcern.JOURNALED
:写入操作在主节点将数据写入磁盘日志后返回。
以下示例将MongoClient实例的写入关注度设置为"majority"
:
MongoClientSettings settings = MongoClientSettings.builder() .applyConnectionString(new ConnectionString("<your connection string>")) .writeConcern(WriteConcern.MAJORITY) .build(); MongoClient client = MongoClients.create(settings);
以下示例将集合的写入关注度设置为"majority"
:
MongoCollection<Document> collection = database.getCollection("<collection name>"); collection = collection.withWriteConcern(WriteConcern.MAJORITY);
注意
集合和数据库是不可变的
MongoDatabase
和MongoCollection
实例是不可变的。当你在数据库或集合上设置写入关注度时,该方法返回一个新实例,而不会影响原始实例。
有关写入关注度的更多信息,请参阅写入关注度在MongoDB服务器手册。
读取关注度
读取关注度指定以下行为
您可以通过客户端或事务上的readConcern()
方法或数据库或集合上的withReadConcern()
方法指定读取关注度。`readConcern()`和`withReadConcern()`方法接受一个参数,指定读取关注度级别。
您可以设置以下读取关注度级别
ReadConcern.LOCAL
:查询返回实例的最新数据。不提供数据已写入副本集多数成员的保证。ReadConern.AVAILABLE
:查询返回实例的最新数据。不提供数据已写入副本集多数成员的保证。`ReadConcern.AVAILABLE`不可与因果一致会话和事务一起使用。ReadConcern.MAJORITY
:查询返回已由副本集多数成员确认的数据。ReadConcern.LINEARIZABLE
:查询返回反映在读取操作开始之前成功完成的全部写入的数据。`ReadConcern.LINEARIZABLE`不可与因果一致会话和事务一起使用。ReadConcern.SNAPSHOT
:查询返回最近过去特定单点在分片中呈现的多数提交数据。
有关读取关注级别的更多信息,请参阅MongoDB服务器手册中的读取关注级别。
以下示例将读取关注级别设置为ReadConcern.MAJORITY
,针对一个MongoClient
实例。
MongoClientSettings settings = MongoClientSettings.builder() .applyConnectionString(new ConnectionString("<your connection string>")) .readConcern(ReadConcern.MAJORITY) .build(); MongoClient client = MongoClients.create(settings);
以下示例将读取关注级别设置为ReadConcern.MAJORITY
,针对一个集合。
MongoCollection<Document> collection = database.getCollection("<collection name>"); collection = collection.withReadConcern(ReadConcern.MAJORITY);
有关读取关注级别的更多信息,请参阅MongoDB服务器手册中的读取关注。
读取偏好
读取偏好决定了MongoDB在运行查询时从副本集的哪个成员读取。您可以通过在客户端或事务上使用readPreference()
方法,或在数据库或集合上使用withReadPreference()
方法来设置读取偏好。
readPreference()
和withReadPreference()
方法接受一个读取偏好模式作为参数。您可以设置读取偏好模式为以下值之一
ReadPreference.primary()
:查询从主节点返回数据。ReadPreference.primaryPreferred()
:如果可用,查询从主节点返回数据。否则,查询从从节点返回数据。ReadPreference.secondary()
:查询从从节点返回数据。ReadPreference.secondaryPreferred()
:如果可用,查询从从节点返回数据。否则,查询从主节点返回数据。ReadPreference.nearest()
:查询从网络延迟最低的节点返回数据。
以下示例将读取偏好设置为ReadPreference.secondary()
,针对一个MongoClient
实例。
MongoClientSettings settings = MongoClientSettings.builder() .applyConnectionString(new ConnectionString("<your connection string>")) .readPreference(ReadPreference.secondary()) .build();
以下示例将读取偏好设置为ReadPreference.secondary()
,针对一个集合。
MongoCollection<Document> collection = database.getCollection("<collection name>"); collection = collection.withReadPreference(ReadPreference.secondary());
有关读取偏好的更多信息,请参阅MongoDB服务器手册中的读取偏好。
API 文档
要了解更多关于本指南中讨论的任何方法或类型,请参阅以下 API 文档