对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

修改 CRUD 操作的执行

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

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

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

  • 会话级别

  • 事务级别

  • 数据库级别

  • 集合级别

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

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

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

方法
说明

Custom()

客户端请求确认写入操作传播到 mongod 实例的标签节点。有关详细信息,请参阅 写关注(write concern)规范

参数string

Journaled()

客户端请求确认写入操作已写入磁盘上的日志记录。有关详细信息,请参阅写关注(write concern)规范

参数:无

Majority()

客户端请求确认写入操作传播到大多数承载数据的有投票权节点。有关详细信息,请参阅写关注(write concern)规范

参数:无

Unacknowledged()

客户端不请求确认写入操作。有关详细信息,请参阅 w: 0 的写关注(write concern)规范

参数:无

W1()

客户端请求确认写入操作已写入节点上的内存,例如独立运行的 mongod 或副本集中的主节点。有关详细信息,请参阅 w: 1 的写关注(write concern)规范

参数:无

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

字段
说明

W

指定写入操作必须传播到进行确认的 mongod 实例或标签节点的数量。常用值包括 10"majority"

类型stringint

Journal

指定是否必须将写入操作写入磁盘日志记录以供确认。

类型bool

WTimeout

指定写关注(write concern)的时间限制。此设置仅适用于大于 1 的 W 值。同时指定此设置和客户端上的 Timeout 会导致未定义行为。要了解更多信息,请参阅 wtimeout 的写关注(write concern)规范

类型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)

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