文档菜单
文档首页
/ / /
Go 驱动程序
/ /

修改CRUD操作执行

本页内容

  • 概述
  • 写入关注点
  • 读取关注点
  • 读取偏好
  • 更多信息

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

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

  • 客户端级别,它设置所有操作执行的默认值,除非被覆盖

  • 会话级别

  • 事务级别

  • 数据库级别

  • 集合级别

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

写入关注点描述了在副本集中,必须确认写入操作(如插入或更新)才能将操作返回为成功的具有数据承载成员的数量。默认情况下,写入关注点仅要求主副本集成员在操作被认为是成功之前确认写入操作。

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

方法
描述
Custom()
客户端请求确认写入操作已传播到 mongod 实例的标记成员。有关更多信息,请参阅写入关注规范.

参数: string
Journaled()
客户端请求确认写入操作已写入磁盘上的日志。有关更多信息,请参阅写入关注规范

参数: none
Majority()
客户端请求确认写入操作已传播到大多数承载数据的投票成员。有关更多信息,请参阅写入关注规范

参数: none
Unacknowledged()
客户端请求不对写入操作进行确认。有关更多信息,请参阅对于 w: 0 的写入关注规范

参数: none
W1()
客户端请求确认写入操作已写入一个节点(如独立 mongod 或副本集中的主节点)的内存中。有关更多信息,请参阅对于 w: 1 的写入关注规范

参数: none

如果您需要更专业的写入关注,可以定义自定义的 WriteConcern 结构字面量。您可以在 WriteConcern 结构中设置以下字段

字段
描述
W
指定写入操作必须传播到的 mongod 实例或标记成员的数量以进行确认。常见值包括 10"majority"

类型: stringint
Journal
指定写入操作是否必须写入磁盘上的日志以进行确认。

类型: bool
WTimeout
指定写入关注的时间限制。此设置仅适用于 W 值大于 1 的情况。超时 在客户端同时发生会导致未定义的行为。要了解更多信息,请参阅 写关注 wtimeout 规范

类型: time.Duration

提示

您还可以在连接字符串中指定写关注。有关更多信息,请参阅 服务器手册中的写关注选项

以下代码展示了如何在客户端和集合级别指定不同的写关注。客户端级别的写关注请求来自两个副本集成员的确认,并将日志记录设置为 false。集合级别的写关注请求来自大多数副本集成员的确认。

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)

读取关注选项允许您确定客户端从查询返回哪些数据。默认的读取关注级别是 "local",这意味着客户端返回实例的最新数据,不保证数据已写入大多数副本集成员。

MongoDB Go 驱动提供了 readconcern 包,该包允许您为副本集指定读取关注点。使用 SetReadConcern() 方法并传递一个 ReadConcern 类型来设置读取关注点。ReadConcern 类型具有以下方法来指定读取关注点

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

以下代码演示了如何指定“majority”读取关注点。然后代码选择具有此选项的 Collection

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

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

读取偏好包括读取偏好模式,可选的标签集列表maxStalenessSeconds选项,以及hedged read选项。

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

方法
描述
Nearest()
客户端根据指定的延迟阈值从随机合格的副本集成员(主或次)读取。更多信息,请参阅读取偏好服务器手册条目
Primary()
客户端从当前的副本集主节点读取。更多信息,请参阅读取偏好服务器手册条目
PrimaryPreferred()
客户端在大多数情况下从主节点读取。如果主节点不可用,操作将从次成员读取。更多信息,请参阅读取偏好服务器手册条目
Secondary()
客户端从副本集的次要成员读取。更多信息,请参阅读取偏好服务器手册条目。
SecondaryPreferred()
客户端在大多数情况下从次要节点读取。如果次要节点不可用,则操作从主节点读取。更多信息,请参阅读取偏好服务器手册条目。

提示

您可以在连接字符串中指定读取偏好。有关更多信息,请参阅读取偏好选项服务器手册条目

以下代码展示了如何指定读取偏好以从次要节点读取。然后代码选择具有此选项的数据库

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

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

后退

复合操作