Docs 主页 → 开发应用程序 → MongoDB Manual
setDefaultRWConcern
定义
setDefaultRWConcern
setDefaultRWConcern
管理命令为副本集或分片集群设置全局默认读关注或写关注配置。setDefaultRWConcern
必须针对admin
数据库运行。对于副本集,请在
setDefaultRWConcern
主mongod
上发出 命令。对于分片集群,请在
mongos
上发出setDefaultRWConcern
。
语法
该命令具有以下语法:
db.adminCommand( { setDefaultRWConcern : 1, defaultReadConcern: { <read concern> }, defaultWriteConcern: { <write concern> }, writeConcern: { <write concern> }, comment: <any> } )
命令字段
该命令接受以下字段:
字段 | 类型 | 说明 |
---|---|---|
int | 设置为 | |
object | 包含全局读关注配置的文档。指定一个有效的读关注对象。
省略此文档可保持当前的全局读关注不变。如果省略,则 | |
object | 包含全局默认写关注配置的文档。
省略此文档可保持当前的全局写关注不变。如果省略,则 | |
对象 | 可选。指定由 命令本身使用的 写关注 如果省略, | |
comment | 注意到 | 可选。用户提供的待附加到该命令的注释。设置后,该注释将与该命令的记录一起出现在以下位置:
注释可以是任何有效的 BSON 类型(字符串、整型、对象、数组等)。 |
setDefaultRWConcern
返回一个对象,其中包含当前配置的全局默认读关注和写关注。有关返回字段的更完整文档,请参阅getDefaultRWConcern
。
行为
注意
需要 featureCompatibilityVersion 4.4+
副本集或分片集群中的每个mongod
都必须将featureCompatibilityVersion设置为至少4.4
才能使用setDefaultRWConcern
。
从 MongoDB 5开始。 0 ,一旦通过setDefaultRWConcern
命令设置了集群范围的写关注 (CWWC),就无法取消设置。
MongoDB 仅将全局默认读关注或写关注应用于未显式指定读关注或写关注的操作。
如果 MongoDB 将全局默认的读关注或写关注应用于某个操作,则该操作的行为就像该读关注或写关注是由发出客户端显式指定的一样。
副本集
针对副本集setDefaultRWConcern
主 节点发出 。主节点将新的全局默认设置复制到副本集的其余节点。尚未复制更新的全局默认设置的从节点继续使用默认值的本地“过时”副本。
发出setDefaultRWConcern
命令( writeConcern为w : "majority"
,确保该命令仅在更改传播到大多数副本集成员后返回。
分片集群
针对集群中的setDefaultRWConcern
mongos
发出mongos
。 将更新的设置保存到 配置服务器副本集 (CSRS) 。每个mongos
都会定期针对getDefaultRWConcern
CSRS 发出mongos
,以刷新全局设置的本地副本。 在刷新之间的时间段内使用全局默认值的本地“过时”副本。
发出setDefaultRWConcern
命令( writeConcern为w : "majority"
,确保该命令仅在更改传播到大多数 CSRS 成员后返回。
当应用程序在未明确指定读关注或写关注设置的情况下针对 mongos
执行操作时,mongos
将应用相应的全局默认设置。
全局默认设置不会传播到各个分片。您无法对分片运行setDefaultRWConcern
。
重要
setDefaultRWConcern
需要featureCompatibilityVersion 4.4+
。如果您将部署的featureCompatibilityVersion从4.4
降级为4.2
,则所有集群范围的读关注和写关注默认值都将丢失,但mongos
实例可能会继续应用默认值长达30秒。
分片管理命令覆盖写关注设置
在配置服务器上执行写入操作的分片管理命令,例如 enableSharding
或 addShard
命令,使用全局默认写关注设置时具有特定行为:
无论配置何种全局默认写关注,这些命令都使用
"majority"
。这些命令使用的最小 wtimeout 为
60000
。仅当全局默认写关注大于60000
时,这些命令才使用全局默认写关注wtimeout
。
访问控制
对于强制执行Authentication的副本集或分片集群, setDefaultRWConcern
要求经过身份验证的用户具有setDefaultRWConcern
特权操作。
例子
设置全局默认写关注
以下操作将全局写关注设置为:
db.adminCommand({ "setDefaultRWConcern" : 1, "defaultWriteConcern" : { "w" : 2 } })
该操作返回类似于以下内容的文档:
{ "defaultWriteConcern" : { "w" : 2 }, "updateOpTime" : Timestamp(1586290895, 1), "updateWallClockTime" : ISODate("2020-04-07T20:21:41.849Z"), "localUpdateWallClockTime" : ISODate("2020-04-07T20:21:41.862Z"), "ok" : 1, "$clusterTime" : { ... } "operationTime" : Timestamp(1586290925, 1) }
设置全局默认读关注
以下操作将全局读关注设置为 "majority"
:
db.adminCommand({ "setDefaultRWConcern" : 1, "defaultReadConcern" : { "level" : "majority" } })
该操作返回类似于以下内容的文档:
{ "defaultReadConcern" : { "level" : "majority" }, "updateOpTime" : Timestamp(1586290895, 1), "updateWallClockTime" : ISODate("2020-04-07T20:21:41.849Z"), "localUpdateWallClockTime" : ISODate("2020-04-07T20:21:41.862Z"), "ok" : 1, "$clusterTime" : { ... } "operationTime" : Timestamp(1586290925, 1) }
取消设置全局默认读关注和写关注
以下操作将全局默认读关注和写关注设置为:
w: 2
写入安全机制level: "majority"
读关注。
db.adminCommand({ "setDefaultRWConcern" : 1, "defaultWriteConcern" : { "w" : 2 }, "defaultReadConcern" : { "level" : "majority" } })
该操作返回类似于以下内容的文档:
"defaultWriteConcern" : { "w" : 2 }, "defaultReadConcern" : { "level" : "majority" }
设置全局默认读关注和写关注
您可以:
取消设置全局默认读关注。
仅当尚未设置全局默认写关注时,才能取消设置。
例如,假设全局默认读关注设置为 level: "majority"
。要取消设置全局默认读关注,请使用空文档 {}
:
db.adminCommand( { "setDefaultRWConcern" : 1, "defaultReadConcern" : {} } )
该操作返回一个文档,指明操作成功:
{ defaultReadConcern: { level: 'local' }, defaultWriteConcern: { w: 2, wtimeout: 0 }, updateOpTime: Timestamp({ t: 1656696934, i: 1 }), updateWallClockTime: ISODate("2022-07-01T17:35:40.578Z"), defaultWriteConcernSource: 'global', defaultReadConcernSource: 'implicit', localUpdateWallClockTime: ISODate("2022-07-01T17:35:40.578Z"), ok: 1, '$clusterTime': { ... }, operationTime: Timestamp({ t: 1656632593, i: 1 }) }
仅当尚未设置全局默认写关注时才能取消设置。
要取消设置全局默认写关注,请使用空文档 {}
:
db.adminCommand( { "setDefaultRWConcern" : 1, "defaultWriteConcern" : {} } )
如果全局默认写关注为:
取消设置,操作成功。
已设置,操作将返回以下错误。
MongoServerError: The global default write concern cannot be unset once it is set.