数据库和集合
在此页面上
Overview
在本指南中,您可以了解如何通过 PyMongo 使用 MongoDB 数据库和集合。
MongoDB 将数据组织成以下级别的层次结构:
数据库:MongoDB 实例中数据组织的顶层。
集合:MongoDB 将文档存储在集合中。 它们类似于关系数据库中的表。
文档:包含字面数据,例如string 、数字、日期和其他嵌入式文档。
有关文档字段类型和结构的更多信息,请参阅 MongoDB Server 手册中的文档指南。
访问数据库
对 MongoClient
实例使用字典式访问权限来访问数据库。
以下示例将访问名为test_database
的数据库:
database = client["test_database"]
访问集合
通过对数据库实例使用字典式访问来访问集合。
以下示例访问名为 test_collection
的集合:
database = client["test_database"] collection = database["test_collection"]
提示
如果提供的集合名称在数据库中尚不存在,则当您首次向其中插入数据时,MongoDB 会隐式创建该集合。
创建集合
使用 create_collection()
方法在MongoDB database中显式创建集合。
以下示例创建了一个名为example_collection
的collection:
database = client["test_database"] database.create_collection("example_collection")
您可以通过将集合选项(例如最大大小和文档验证规则)作为关键字参数传递来指定这些选项。 有关可选参数的完整列表,请参阅 create_collection() API文档。
时间序列集合
时间序列集合可有效存储一段时间内的测量序列。 以下示例创建了一个名为 example_ts_collection
的时间序列集合,其中文档的时间字段名为 timestamp
:
database = client["test_database"] database.create_collection("example_ts_collection", timeseries={"timeField": "timestamp"})
固定大小集合
您可以创建固定大小集合,但该集合的增长不能超过指定的内存大小或文档计数。 以下示例创建了一个名为 example_capped_collection
的固定大小集合,其最大大小为 1000 字节:
database = client["test_database"] database.create_collection("example_capped_collection", capped=True, size=1000)
获取集合列表
您可以通过调用list_collections()
方法来查询数据库中的集合列表。 该方法返回一个游标,其中包含数据库中的所有集合及其关联的元数据。
以下示例调用list_collections()
方法并对游标进行迭代以打印结果:
collection_list = database.list_collections() for c in collection_list: print(c)
要仅查询数据库中集合的名称,请调用list_collection_name()
方法,如下所示:
collection_list = database.list_collection_names() for c in collection_list: print(c)
有关迭代游标的更多信息,请参阅从游标访问数据。
删除集合
您可以使用drop_collection()
方法从数据库中删除集合。
以下示例删除test_collection
集合:
collection = database["test_collection"]; collection.drop();
警告
删除集合会删除该集合中的所有数据
从数据库中删除集合会永久删除该集合中的所有文档和所有索引。
仅当不再需要集合中的数据时才删除集合。
配置读取和写入操作
您可以通过设置读取偏好来控制驱动程序路由读取操作的方式。 您还可以通过设置读关注和写关注来控制驱动程序如何等待副本集上读写操作确认的选项。
默认情况下,数据库从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
参数的标签集指示 PyMongo 优先从纽约数据中心 ( 'dc': 'ny'
) 读取数据,并回退到旧金山数据中心 ( 'dc': 'sf'
):
db = client.get_database( 'test', read_preference=Secondary([{'dc': 'ny'}, {'dc': 'sf'}]))
LocalThreshold
如果多个副本集成员与您指定的读取偏好和标签集匹配,PyMongo 将从根据其 ping 时间选择的最近的副本集成员中读取。
默认情况下,驱动程序仅使用 ping 时间与最近节点的 ping 时间在15毫秒以内的节点进行查询。 要在延迟较高的成员之间分配读取,请将localThresholdMS
选项传递给MongoClient()
构造函数。
以下示例指定了35毫秒的本地阈值:
client = MongoClient(replicaSet='repl0', readPreference=ReadPreference.SECONDARY_PREFERRED, localThresholdMS=35)
在前面的示例中,PyMongo 在最近成员的 ping 时间的35毫秒内在匹配成员之间分配读取。
注意
通过mongos
实例与副本集通信时,PyMongo 会忽略localThresholdMS
的值。 在这种情况下,请使用localThreshold命令行选项。
可重试读取和写入
如果某些写入操作由于网络或服务器错误而失败, PyMongo会自动重试一次。
您可以通过在 MongoClient()
构造函数中将 retryReads
或 retryWrites
选项设置为 False
来显式禁用可重试读取或可重试写入。 以下示例为客户端禁用可重试读取和写入:
client = MongoClient("<connection string>", retryReads=False, retryWrites=False)
要学习;了解有关支持的可重试读取操作的更多信息,请参阅MongoDB Server手册中的可重试读取。要学习;了解有关支持的可重试写入操作的更多信息,请参阅MongoDB Server手册中的可重试写入。
类型提示
如果您的应用程序使用Python3.5 或更高版本,您可以在代码中添加类型提示(如 PEP484 中所述)。类型提示表示变量、参数和函数返回值的数据类型以及文档的结构。某些 IDE 可以使用类型提示来检查代码是否存在类型错误,并为代码完成建议适当的选项。
注意
Python 3.7 及更早版本中的 TypedDict
TypedDict 类位于typing
模块中,该模块仅在Python.3 8TypedDict
及更高版本中可用。要在早期版本的Python中使用 类,请安装typing_extensions包。
Database
如果数据库中的所有文档都匹配定义明确的模式,则可以指定使用Python类来表示文档结构的类型提示。通过在 Database
对象的类型提示中包含此类,可以确保存储或检索的所有文档都具有所需的结构。与默认的Dict[str, Any]
类型相比,这提供了更准确的类型检查和代码完成。
首先,定义一个类来表示数据库中的文档。该类必须从 TypedDict
类继承,并且必须包含与数据库中的文档相同的字段。定义类后,将其名称作为 Database
类型提示的泛型类型。
以下示例定义了一个 Movie
类,并将其用作 Database
类型提示的泛型类型:
from typing import TypedDict from pymongo import MongoClient from pymongo.database import Database class Movie(TypedDict): name: str year: int client: MongoClient = MongoClient() database: Database[Movie] = client["test_database"]
Collection
向 Collection
类型提示添加泛型类型与向 Database
类型提示添加泛型类型类似。首先,定义一个类,它从 TypedDict
类继承并表示集合中文档的结构。然后,将类名称作为泛型类型包含在 Collection
类型提示中,如以下示例所示:
from typing import TypedDict from pymongo import MongoClient from pymongo.collection import Collection class Movie(TypedDict): name: str year: int client: MongoClient = MongoClient() database = client["test_database"] collection: Collection[Movie] = database["test_collection"]
故障排除
客户端类型注解
如果没有为 MongoClient
对象添加类型注解,类型检查器可能会显示类似于以下内容的错误:
from pymongo import MongoClient client = MongoClient() # error: Need type annotation for "client"
解决方案是将 MongoClient
对象注释为 client: MongoClient
或 client: MongoClient[Dict[str, Any]]
。
不兼容类型
如果您指定 MongoClient
作为类型提示,但不包含文档、键和值的数据类型,则类型检查器可能会显示类似于以下内容的错误:
error: Dict entry 0 has incompatible type "str": "int"; expected "Mapping[str, Any]": "int"
解决方案是将以下类型提示添加到 MongoClient
对象:
``client: MongoClient[Dict[str, Any]]``
AutoReconnect
错误
如果您在读取偏好中指定tag-sets
,并且 MongoDB 无法找到具有指定标签的副本集成员,您会收到此错误。 要避免此错误,请在标签集列表的末尾包含一个空字典 ( {}
)。 这指示 PyMongo 在找不到匹配标签时,从任何与读取引用模式匹配的成员中读取。
API 文档
要进一步了解本指南所讨论的任何方法或类型,请参阅以下 API 文档: