文档首页 → 开发应用程序 → Python 驱动程序 → PyMongo
数据库和集合
概述
在本指南中,您可以学习如何使用PyMongo与MongoDB数据库和集合。
MongoDB将数据组织为以下级别的层次结构
数据库:MongoDB实例中数据组织的顶层。
集合:MongoDB在集合中存储文档。它们类似于关系数据库中的表。
文档:包含字符串、数字、日期和其他嵌入文档等字面数据。
有关文档字段类型和结构的更多信息,请参阅MongoDB服务器手册中的文档指南。
访问数据库
通过在您的MongoClient
实例上使用字典样式访问来访问数据库。
以下示例访问名为 "test_database" 的数据库
database = client["test_database"]
访问集合
通过在您的数据库实例上使用字典式访问来访问集合。
以下示例访问名为 "test_collection" 的集合
database = client["test_database"] collection = database["test_collection"]
提示
如果提供的集合名称在数据库中不存在,MongoDB会在您首次向其中插入数据时隐式创建该集合。
创建集合
使用 create_collection()
方法在MongoDB数据库中显式创建集合。
以下示例创建了一个名为 "example_collection"
的集合
database = client["test_database"] database.create_collection("example_collection")
您可以通过传递关键字参数来指定集合选项,例如最大大小和文档验证规则。有关可选参数的完整列表,请参阅create_collection() API文档。
获取集合列表
您可以通过调用 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服务器手册中的以下指南
标签集合
在MongoDB服务器中,您可以根据您选择的任何标准将键值标签应用于副本集成员。然后,您可以使用这些标签针对一个或多个成员进行读取操作。
默认情况下,PyMongo在选择读取成员时会忽略标签。要指示PyMongo优先考虑某些标签,请在您的读取偏好类构造函数中将它们作为参数传递。
在下面的代码示例中,传递给read_preference
参数的标签集合指示PyMongo优先从纽约数据中心('dc': 'ny'
)读取,并回退到旧金山数据中心('dc': 'sf'
)。
db = client.get_database( 'test', read_preference=Secondary([{'dc': 'ny'}, {'dc': 'sf'}]))
本地阈值
如果有多个副本集成员匹配您指定的读取偏好和标签集合,PyMongo将根据它们的ping时间从最近的副本集成员读取。
默认情况下,驱动程序仅使用ping时间在最近成员15毫秒之内的成员进行查询。为了在具有更高延迟的成员之间分配读取,请将localThresholdMS
选项传递给MongoClient()
构造函数。
以下示例指定了35毫秒的本地阈值。
client = MongoClient(replicaSet='repl0', readPreference=ReadPreference.SECONDARY_PREFERRED, localThresholdMS=35)
在上面的示例中,PyMongo在距离最接近成员的ping时间35毫秒内匹配的成员之间分配读取。
注意
当通过mongos
实例与副本集通信时,PyMongo会忽略localThresholdMS
的值。在这种情况下,请使用localThreshold命令行选项。
故障排除
AutoReconnect
错误
如果您在读取首选项中指定了 tag-sets
,但MongoDB无法找到具有指定标签的副本集成员,则会收到此错误。为了避免此错误,在标签集列表的末尾包含一个空字典({}
)。这指示PyMongo在找不到匹配的标签时从任何匹配读取引用模式的成员读取。
API 文档
要了解本指南中讨论的任何方法或类型,请参阅以下API文档