修改CRUD操作执行
概述
在本指南中,您可以了解如何使用副本集的写入关注点、读取关注点和读取偏好配置来修改MongoDB Go Driver执行创建、读取、更新和删除(CRUD)操作的方式。
您可以在以下级别设置写入关注点、读取关注点和读取偏好选项:
客户端级别,它设置所有操作执行的默认值,除非被覆盖
会话级别
事务级别
数据库级别
集合级别
在以下部分中,您可以了解如何自定义副本集中的数据一致性和可用性。
写入关注点
写入关注点描述了在副本集中,必须确认写入操作(如插入或更新)才能将操作返回为成功的具有数据承载成员的数量。默认情况下,写入关注点仅要求主副本集成员在操作被认为是成功之前确认写入操作。
选项
MongoDB Go 驱动程序提供writeconcern
包,允许您指定副本集的写入关注。使用 SetWriteConcern()
方法并传入 WriteConcern
类型来设置写入关注。以下为 WriteConcern
类型的方法,用于选择常见的写入关注规范
方法 | 描述 |
---|---|
Custom() | |
Journaled() | |
Majority() | |
Unacknowledged() | |
W1() |
如果您需要更专业的写入关注,可以定义自定义的 WriteConcern
结构字面量。您可以在 WriteConcern
结构中设置以下字段
字段 | 描述 |
---|---|
W | 指定写入操作必须传播到的 mongod 实例或标记成员的数量以进行确认。常见值包括 1 、0 和 "majority" 。类型: string 或 int |
Journal | 指定写入操作是否必须写入磁盘上的日志以进行确认。 类型: bool |
WTimeout |
提示
您还可以在连接字符串中指定写关注。有关更多信息,请参阅 服务器手册中的写关注选项。
示例
以下代码展示了如何在客户端和集合级别指定不同的写关注。客户端级别的写关注请求来自两个副本集成员的确认,并将日志记录设置为 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)
更多信息
有关本指南中的概念更多信息,请参阅以下服务器文档