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

配置增删改查操作

在本指南中,您可以学习;了解如何在PyMongo中配置读取和写入操作。

您可以通过设置读取偏好来控制驱动程序路由读取操作的方式。 您还可以通过设置读关注写关注来控制驱动程序如何等待副本集上读写操作确认的选项。

默认情况下,数据库从MongoClient实例继承这些设置,集合从数据库继承这些设置。 但是,您可以使用以下方法之一更改数据库或集合的这些设置:

  • get_database():获取数据库并应用客户端的读取偏好、读关注和写入偏好。

  • database.with_options():获取数据库并应用其当前的读取偏好、读关注和写入偏好。

  • get_collection():获取集合并应用其当前的读取偏好、读关注和写入偏好。

  • collection.with_options():获取集合并应用数据库的读取偏好、读关注和写入偏好。

若要使用上述方法更改读取或写入设置,请调用该方法并传入集合或数据库名称以及新的读取偏好、读关注或写入偏好。

以下示例展示了如何使用get_database()方法更改名为test-database的数据库的读取偏好、读关注和写入偏好:

client.get_database("test-database",
read_preference=ReadPreference.SECONDARY,
read_concern="local",
write_concern="majority")

以下示例展示了如何使用get_collection()方法更改名为test-collection的集合的读取和写入设置:

database.get_collection("test-collection",
read_preference=ReadPreference.SECONDARY,
read_concern="local",
write_concern="majority")

以下示例展示了如何使用with_options()方法更改名为test-collection的集合的读取和写入设置:

collection.with_options(read_preference=ReadPreference.SECONDARY,
read_concern="local",
write_concern="majority")

提示

要查看 ReadPreference 枚举中可用的读取偏好类型,请参阅API文档。

要了解有关读取和写入设置的更多信息,请参阅 MongoDB Server 手册中的以下指南:

在 MongoDB Server 中,您可以根据您选择的任何条件将键值标签应用于副本集成员。 然后,您可以使用这些标签来定位一个或多个成员以执行读取操作。

默认下, PyMongo在选择要读取的成员时会忽略标签。要指示PyMongo优先选择某些标签,请将它们作为参数传递给读取偏好(read preference)构造函数。

在以下代码示例中,传递给read_preference参数的标签集指示 PyMongo 优先从纽约数据中心 ( 'dc': 'ny' ) 读取数据,并回退到旧金山数据中心 ( 'dc': 'sf' ):

db = client.get_database(
'test', read_preference=Secondary([{'dc': 'ny'}, {'dc': 'sf'}]))

连接到副本集时,并使用非主节点 (primary node in the replica set) 读取偏好(read preference),驱动程序会从延迟窗口内最近的符合条件的副本集读取。连接到分片集群时,驱动程序会从延迟窗口内所有可访问的 mongos 实例中进行选择。要了解读取偏好模式,请参阅 读取偏好(read preference)。

默认情况下,驱动程序仅使用网络探测(ping)时间在距离最近的符合条件的服务器 15 毫秒以内的服务器。

例如,假设您的副本集有五个节点,而最近的节点的网络探测(ping)时间为 5 毫秒。使用默认 localThresholdMS (15 毫秒),只有网络探测(ping)时间小于或等于 20 毫秒的节点才在延迟窗口内,如下表所示:

主机
类型
网络探测(ping)时间
延迟窗口内

host1

主节点

5 毫秒

host2

从节点

9 毫秒

host3

从节点

13 毫秒

host4

从节点

24 毫秒

No

host5

从节点

42 毫秒

No

要调整延迟窗口,请将 localThresholdMS 选项传递给 MongoClient() 构造函数。

以下示例指定了 35 毫秒的本地阈值。选择SynchronousAsynchronous标签页以查看相应的代码:

client = MongoClient(replicaSet='repl0',
readPreference=ReadPreference.SECONDARY_PREFERRED,
localThresholdMS=35)
client = AsyncMongoClient(replicaSet='repl0',
readPreference=ReadPreference.SECONDARY_PREFERRED,
localThresholdMS=35)

在前面的示例中,PyMongo 在最近成员的 ping 时间的35毫秒内在匹配成员之间分配读取。

注意

通过mongos实例与副本集通信时,PyMongo 会忽略localThresholdMS的值。 在这种情况下,请使用localThreshold命令行选项。

如果某些写入操作由于网络或服务器错误而失败, PyMongo会自动重试一次。

您可以通过在 MongoClient() 构造函数中将 retryReadsretryWrites 选项设置为 False 来显式禁用可重试读取或可重试写入。以下示例禁用客户端的可重试读取和写入。选择SynchronousAsynchronous标签页以查看相应的代码:

client = MongoClient("<connection string>",
retryReads=False, retryWrites=False)
client = AsyncMongoClient("<connection string>",
retryReads=False, retryWrites=False)

要学习;了解有关支持的可重试读取操作的更多信息,请参阅MongoDB Server手册中的可重试读取。要学习;了解有关支持的可重试写入操作的更多信息,请参阅MongoDB Server手册中的可重试写入。

您可以使用以下客户端选项配置PyMongo在服务器返回过载错误时如何处理操作:

  • enable_overload_retargeting:指定驱动程序是否降低返回过载错误的服务器的优先级,从而降低在同一台过载服务器上重试的可能性。默认值为 False

  • max_adaptive_retries:指定当服务器返回过载错误时驱动程序重试操作的最大次数。默认值为 2

以下示例创建了 MongoClient 并配置了重载重试选项。选择SynchronousAsynchronous标签页以查看相应的代码:

client = MongoClient("<connection string>",
enable_overload_retargeting=True,
max_adaptive_retries=3)
client = AsyncMongoClient("<connection string>",
enable_overload_retargeting=True,
max_adaptive_retries=3)

创建集合时,可以为对该集合执行的所有操作指定默认默认规则

排序规则是一设立特定于语言的字符串比较规则,例如字母大小写和重音符号规则。

要指定排序规则,请创建 Collation 类或Python字典的实例。有关要传递给 Collation 构造函数或作为键包含在字典中的选项列表,请参阅MongoDB Server手册中的排序规则

提示

导入排序规则

要创建 Collation 类的实例,必须从 pymongo.collation 导入。

以下示例创建与上一示例相同的集合,但默认默认规则为 fr_CA。选择SynchronousAsynchronous标签页以查看相应的代码:

from pymongo.collation import Collation
database = client["test_database"]
database.create_collection("example_collection", collation=Collation(locale='fr_CA'))
from pymongo.collation import Collation
database = client["test_database"]
await database.create_collection("example_collection", collation=Collation(locale='fr_CA'))