修改 CRUD 操作的执行
Overview
在本指南中,您可以了解如何使用副本集的写关注、读关注和读取偏好配置来修改 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)请求两个副本集成员的确认,并将日志设置为false
。collection写关注(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)
读关注 (read concern)
读关注选项可以让您确定客户端从查询中返回哪些数据。默认的读关注级别为“本地”,这意味着客户端会返回实例的最新数据,但不保证该数据已写入大多数副本集成员。
选项
MongoDB Go 驱动程序提供了 readconcern
包,可用于指定副本集的读关注。使用 SetReadConcern()
方法设置 ReadConcern
类型的读关注。ReadConcern
类型有以下方法来指定读关注:
例子
以下代码显示了如何指定“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
包,它允许您为副本集指定读取偏好。使用类型为 ReadPref
的 SetReadPreference()
方法设置读取偏好。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)
更多信息
有关本指南中概念的更多信息,请参阅以下服务器文档: