Docs 菜单

数据库和集合

在本指南中,您可以了解如何通过 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"})

有关通过PyMongo使用时间序列数据的更多信息,请参阅时间序列数据指南。

您可以创建固定大小集合,但该集合的增长不能超过指定的内存大小或文档计数。 以下示例创建了一个名为 example_capped_collection 的固定大小集合,其最大大小为 1000 字节:

database = client["test_database"]
database.create_collection("example_capped_collection", capped=True, size=1000)

要学习;了解有关固定大小集合的更多信息,请参阅MongoDB Server手册中的固定大小集合。

您可以通过调用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();

警告

删除集合会删除该集合中的所有数据

从数据库中删除集合会永久删除该集合中的所有文档和所有索引。

仅当不再需要集合中的数据时才删除集合。

如果您的应用程序使用Python3.5 或更高版本,您可以在代码中添加类型提示(如 PEP484 中所述)。类型提示表示变量、参数和函数返回值的数据类型以及文档的结构。某些 IDE 可以使用类型提示来检查代码是否存在类型错误,并为代码完成建议适当的选项。

注意

Python 3.7 及更早版本中的 TypedDict

TypedDict 类位于typing 模块中,该模块仅在Python.3 8TypedDict及更高版本中可用。要在早期版本的Python中使用 类,请安装typing_extensions包。

如果数据库中的所有文档都匹配定义明确的模式,则可以指定使用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 类型提示添加泛型类型与向 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: MongoClientclient: 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]]``

如果您在读取偏好中指定tag-sets ,并且 MongoDB 无法找到具有指定标签的副本集成员,您会收到此错误。 要避免此错误,请在标签集列表的末尾包含一个空字典 ( {} )。 这指示 PyMongo 在找不到匹配标签时,从任何与读取引用模式匹配的成员中读取。

要进一步了解本指南所讨论的任何方法或类型,请参阅以下 API 文档: