Docs 菜单
Docs 主页
/ / /
Go 驱动程序
/ /

修改 CRUD 操作的执行

在此页面上

  • Overview
  • 写关注
  • 读关注 (read concern)
  • 读取偏好
  • 更多信息

在本指南中,您可以了解如何使用副本集的写关注读关注读取偏好配置来修改 MongoDB Go 驱动程序执行创建、读取、更新和删除 (CRUD) 操作的方式。

您可以在以下级别设置写关注、读关注和读取偏好选项:

  • 客户端级别,除非被覆盖,否则将为所有操作执行设置默认值

  • 会话级别

  • 事务级别

  • 数据库级别

  • 集合级别

在以下各节中,您可以了解如何自定义副本集中数据的一致性和可用性。

写关注(write concern)描述了副本集中承载数据的成员的数量,这些成员必须在操作成功返回之前确认写入操作(例如插入或更新)。默认情况下,写关注(write concern)只要求主节点副本集成员确认写入操作,然后操作被视为成功。

MongoDB Go 驱动程序提供了 writeconcern包,允许您为副本集指定写关注(write concern)。使用具有WriteConcern类型的SetWriteConcern()方法设置写关注(write concern)。WriteConcern类型具有以下方法来选择常见的写关注(write concern)规范:

方法
说明
Custom()
The client requests acknowledgement that write operations propagate to tagged members of a mongod instance. For more information, see the Write Concern specification.

Parameter: string
Journaled()
The client requests acknowledgement that write operations are written to the on-disk journal. For more information, see the Write Concern specification.

Parameter: none
Majority()
The client requests acknowledgement that write operations propagate to the majority of data-bearing voting members. For more information, see the Write Concern specification.

Parameter: none
Unacknowledged()
The client requests requests no acknowledgment of write operations. For more information, see the Write Concern specification for w: 0.

Parameter: none
W1()
The client requests acknowledgement that write operations have been written to memory on one node, such as the standalone mongod or the primary in a replica set. For more information, see the Write Concern specification for w: 1.

Parameter: none

如果需要更专门的写关注,则您可以自行定义 WriteConcern 结构文本。您可以在 WriteConcern 结构中设置以下字段:

字段
说明
W
Specifies the number of mongod instances or tagged members that write operations must propagate to for acknowledgement. Common values include 1, 0, and "majority".

Type: string or int
Journal
Specifies if write operations must be written to the on-disk journal for acknowledgement.

Type: bool
WTimeout
Specifies a time limit for the write concern. This setting is applicable only for W values greater than 1. Specifying this setting and specifying a Timeout on the client at the same time results in undefined behavior. To learn more, see the Write Concern specification for wtimeout.

Type: time.Duration

提示

您也可以在连接string中指定写关注。 有关更多信息,请参阅MongoDB Server手册中有关写关注选项的条目。

以下代码展示了如何在客户端和collection级别指定不同的写关注(write concern)。客户端级写关注(write concern)请求两个副本集成员的确认,并将日志设置为falsecollection写关注(write concern)请求副本集大多数成员的确认。

uri := "mongodb://<hostname>:<port>"
journal := false
cliWC := &writeconcern.WriteConcern{
W: 2,
Journal: &journal,
}
clOpts := options.Client().ApplyURI(uri).SetWriteConcern(cliWC)
client, err := mongo.Connect(context.TODO(), clOpts)
...
collWC := writeconcern.Majority()
collOpts := options.Collection().SetWriteConcern(collWC)
coll := client.Database("db").Collection("myColl", collOpts)

读关注选项可以让您确定客户端从查询中返回哪些数据。默认的读关注级别为“本地”,这意味着客户端会返回实例的最新数据,但不保证该数据已写入大多数副本集成员。

MongoDB Go 驱动程序提供了 readconcern 包,可用于指定副本集的读关注。使用 SetReadConcern() 方法设置 ReadConcern 类型的读关注。ReadConcern 类型有以下方法来指定读关注:

方法
说明
Available()
查询从实例返回数据,但不保证数据已写入大多数副本集成员。 有关更多信息,请参阅读关注规范。
Linearizable()
该查询返回的数据反映了以写关注majority发出并在读操作开始之前确认的所有成功写入。 有关更多信息,请参阅读关注规范。
Local()
查询会返回实例的最新数据。 有关更多信息,请参阅读关注规范。
Majority()
该查询返回确认已写入副本集中大多数成员的实例的最新数据。 有关更多信息,请参阅读关注规范。
Snapshot()
该查询返回特定时间点mongod实例中数据的完整副本。 仅适用于多文档事务中的操作。 有关更多信息,请参阅读关注规范。

以下代码显示了如何指定“majority”的读关注(read concern)。然后,代码会选择带有此选项的Collection

rc := readconcern.Majority()
opts := options.Collection().SetReadConcern(rc)
database := client.Database("db")
coll := database.Collection("myCollection", opts)

读取偏好选项指定 MongoDB 客户端如何将读取操作路由到副本集成员。默认情况下,应用程序将其读取操作定向到副本集中的主节点。

读取偏好由读取偏好模式和可选的标签集列表maxStalenessSeconds选项和对冲读选项组成。

MongoDB Go 驱动程序提供了 readpref 包,它允许您为副本集指定读取偏好。使用类型为 ReadPrefSetReadPreference() 方法设置读取偏好。ReadPref 类型有以下方法来指定读取偏好:

方法
说明
Nearest()
客户端根据指定的延迟阈值从符合条件的随机副本集节点(主节点或从节点)读取。 有关更多信息,请参阅MongoDB Server手册中的读取偏好条目。
Primary()
客户端从当前副本集主节点读取。 有关更多信息,请参阅MongoDB Server手册中的读取偏好条目。
PrimaryPreferred()
在大多数情况下,客户端会从主节点读取数据。 如果主节点不可用,则操作将从节点成员读取。 有关更多信息,请参阅MongoDB Server手册中的读取偏好条目。
Secondary()
客户端从副本集的从节点读取。 有关更多信息,请参阅MongoDB Server手册中的读取偏好条目。
SecondaryPreferred()
在大多数情况下,客户端会从节点读取数据。 如果从节点不可用,则操作将从主节点成员读取。 有关更多信息,请参阅MongoDB Server手册中的读取偏好条目。

提示

您也可以在连接string中指定读取偏好。 有关更多信息,请参阅MongoDB Server手册中有关读取偏好选项的条目。

以下代码显示如何将读取偏好指定到从节点的读取。然后代码使用此选项选择 Database

rp := readpref.Secondary()
opts := options.Database().SetReadPreference(rp)
database := client.Database("db", opts)

有关本指南中概念的更多信息,请参阅以下服务器文档:

后退

复合运算符