数据库与集合
概述
在本指南中,您可以了解如何使用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文档