MongoDB - 使用Python操作MongoDB

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: 本文介绍 使用Python操作MongoDB。

使用Python操作MongoDB数据库


jcLee95的个人博客

已入驻阿里云博客

邮箱 :291148484@163.com
本文地址
- https://developer.aliyun.com/article/
- https://blog.csdn.net/qq_28550263/article/details/119934911

目 录


1. 连接数据库

1.4 数据库与集合

1.5 MongoDB命令与PyMongo方法的对比


1. 连接数据库

1.1 连接前的准备

这里不讲解Python3开发环境的安装和配置。PyMongo是 MongoDB 的官方 MongoDB Python 驱动程序,我们使用如下命令安装pymongo包:

pip install pymongo

1.2 MongoClient对象

MongoClient对象是一个类,为MongoDB集群的客户端表示。其实例可以代表独立的MongoDB服务器、副本集或分片集群,负责维护集群的最新状态,并可能缓存与此相关的资源,包括用于监控的后台线程和连接池。

1.2.1 主要参数

  • host(可选):要连接的单个mongod或mongos实例的主机名或IP地址或Unix域套接字路径,或者mongodb URI,或者主机名/ mongodb URIs列表。如果“主机”是 IPv6文本必须用 “[” 和 “]” 字符括起来,遵循RFC2732 URL语法(例如,对于localhost为“[::1]”)。
  • port(可选):要连接的端口号
  • document_class:用于从此客户端上的查询返回的文档的默认类
  • tz_aware(可选):如果为“True”,类~datetime.datetime实例在文档(document)中通过类`MongoClient’中的文档作为值返回,将是时区感知(timezone aware)的(否则它们将是naive的)
  • connect(可选):如果为True(默认),则后台立刻开始连接到MongoDB。否则在第一次操作数据库时才开始连接。
  • type_registry(可选)bson.codec_options.TypeRegistry类的实例,用于允许用于自定义类型的编解码。

还有一些可选的数组参数,

其他可选参数可以作为关键字参数传递

  • directConnection:如果为True,强制此客户端作为独立客户端直接连接到指定的MongoDB主机。如果为False,客户端连接到给定MongoDB主机所属的整个副本集。
  • maxPoolSize:到每个连接的服务器的最大允许并发连接数。如果与所请求的服务器有“maxPoolSize”未完成的连接,对服务器的请求将被阻止。默认为100。不能为0。
  • minPoolSize:池中将维护到每个连接的服务器的最小所需并发连接数。默认值为0。
  • maxIdleTimeMS:在删除和替换之前,连接在池中可以保持空闲的最大毫秒数。默认为“None”(无限制)。
  • socketTimeoutMS:控制驱动程序在发送普通(非监控)数据库操作后等待响应的时间(以毫秒为单位),然后得出网络错误已经发生的结论。“0”或“None”表示没有超时。默认为“无”(无超时)。
  • connectTimeoutMS:控制驱动程序在服务器监控期间将新套接字连接到服务器时等待多长时间(以毫秒为单位),然后确定服务器不可用。“0”或“None”表示没有超时。默认为20000(20秒)。
  • server_selector:用户提供的增强服务器选择规则的功能。该函数应该接受类pymongo.server_ description.serverdescription对象的列表作为参数,并返回应该被认为适合所需操作的服务器描述的列表。
  • serverSelectionTimeoutMS:控制驱动程序将等待多长时间(毫秒)来找到一个可用的、合适的服务器来执行数据库操作;在等待期间,可以执行多个服务器监控操作,每个操作都由“connectTimeoutMS”控制。默认为“30000 ”( 30秒)。
  • waitQueueTimeoutMS:如果池中没有空闲套接字,线程将等待池中套接字的时间(以毫秒为单位)。默认为“None”(无超时)。
  • waitQueueMultiple:乘以maxPoolSize,给出一次允许等待套接字的线程数。默认为“None”(没有限制)。
  • heartbeatFrequencyMS:定期服务器检查之间的毫秒数,或“None”接受默认频率10秒。
  • appname:创建该MongoClient实例的应用程序的名称。MongoDB 3.4及更高版本将在建立每个连接时在服务器日志中打印该值。它也记录在慢速查询日志和配置文件集合中。
  • driver:在PyMongo之上实现的驱动程序可以传递一个类~pymongo.driver_info.DriverInfo在建立连接时将其名称、版本和平台添加到服务器日志中打印的消息中。
  • event_listeners:事件侦听器的列表或元组。
  • retryWrites:在MongoDB 3.6+上出现网络错误后,是否会重试一次在此MongoClient中执行的受支持的写操作。默认为“True”。
  • retryReads:在MongoDB 3.6+上出现网络错误后,是否会重试一次在此MongoClient中执行的受支持的读取操作。默认为“True”。
  • compressors:有线协议压缩用逗号分隔的压缩器列表。该列表用于与服务器协商压缩器。目前支持的选项有“snappy”、“zlib”和“zstd”。
  • zlibCompressionLevel:当zlib用作有线协议压缩器时使用的zlib压缩级别。支持的值是-1到9。-1告诉zlib库使用其默认压缩级别(通常为6)。0表示没有压缩。1是最好的速度。9是最好的压缩。默认为-1。
  • uuidRepresentation:对以下类的实例进行编码和解码时要使用的BSON表示法:~uuid.UUID类。有效值为pythonLegacy(默认值)、 javaLegacy csharpLegacystandard' 和 unspecified`。新应用程序应考虑将其设置为“standard”以实现跨语言兼容性。
  • unicode_decode_error_handler:当BSON解码过程中发生与Unicode相关的错误时要应用的错误处理程序,否则会引发UnicodeDecodeError。有效选项包括“strict”、“replace”和“ignore”。默认为“strict”。

1.2.2 watch()方法

watch()方法用于观察此群集上的更改,使用隐式的初始$changeStream 阶段执行聚合,并返回~pymongo.change_stream.ClusterChangeStream类游标,它

迭代此群集上所有数据库的更改。

watch(self, pipeline=None, full_document=None, resume_after=None,
              max_await_time_ms=None, batch_size=None, collation=None,
              start_at_operation_time=None, session=None, start_after=None)

参数:

  • pipeline:要附加到初始“�ℎ����������”阶段的聚合管道阶段列表。并非所有管道阶段在‘changeStream阶段的聚合管道阶段列表。并非所有管道阶段在changeStream `'阶段后都有效。
  • full_document:要作为选项传递到$changeStream '阶段的完整文档。允许的值:“updateLookup”。当设置为“updateLookup”时,部分更新的更改通知将包括描述文档更改的增量,以及在更改发生后某个时间更改的整个文档的副本。
  • resume_after:简历令牌。如果提供,更改流将开始返回在resume标记中指定的操作之后直接发生的更改。简历标记是变更文档的_id值。
  • max_await_time_ms:服务器在响应getMore操作之前等待更改的最长时间(毫秒)。
  • batch_size:每批要返回的最大文档数。
  • collation:要用于聚合的~pymongo.collation.Collation
  • start_at_operation_time:如果提供了,结果更改流将只返回在指定的`~bson.timestamp.Timestamp '类或之后发生的更改。
  • session:一个~pymongo.client_session.ClientSession
  • start_after:与“resume_after”相同,只是“start_after”可以在无效事件后恢复通知。该选项和“resume_after”是互斥的。

返回值:

  • 一个~pymongo.change_stream.ClusterChangeStream

1.2.3 其它方法

方法 说明
event_listeners() 为此客户端注册的事件侦听器
topology_description() 连接的MongoDB部署的描述
address() 当前独立、主或mongos或无的(主机、端口)
primary() 副本集的当前主副本的“(主机、端口)”。
如果此客户端未连接到复制集,没有主服务器,或者此客户端是在没有“复制集”选项的情况下创建的,则返回“None”
secondaries() 该客户已知的次要客户端。
一系列(主机、端口)对。如果此客户端未连接到复制集,没有可见的辅助节点,或者此客户端是在没有“复制集”选项的情况下创建的,则为空
arbiters() 副本集中的Arbiters
一系列(主机、端口)对。如果此客户端未连接到副本集,没有Arbiters,或者此客户端是在没有"replicaSet"集”选项的情况下创建的,则为空
is_primary() 是否该客户端连接到可以接受写入的服务器
is_mongos() 如果这个客户端连接到mongos。如果客户端未连接,这将一直阻止,直到建立连接,或者如果没有可用的服务器,将引发ServerSelectionTimeoutError错误
max_pool_size() 到每个连接的服务器的最大允许并发连接数。如果与所请求的服务器有“maxPoolSize”未完成的连接,对服务器的请求将被阻止。默认为100。不能为0
min_pool_size() 池将维护到每个连接的服务器的最小所需并发连接数。默认值为0
max_idle_time_ms() 在删除和替换之前,连接在池中可以保持空闲的最大毫秒数。默认为“None”(无限制)
nodes() 当前连接的所有服务器的集合
max_bson_size() 连接的服务器接受的最大BSON对象,以字节为单位
max_message_size() 连接的服务器接受的最大消息,以字节为单位
max_write_batch_size() 如果客户端没有连接,这将阻止连接,直到建立连接,或者如果没有服务器可用,将引发 ServerSelectionTimeoutError 错误
local_threshold_ms() 服此实例的本地阈值
server_selection_timeout() 此实例的服务器选择超时(秒)
retry_writes() 如果此实例应该重试支持的写操作
retry_reads() 如果此实例应该重试支持的读操作

1.3 连接到某主机上的MongoDB数据库服务

1.3.1 PyMongo连接MongoDB 的参考写法

# 伪代码
import pymongo
# 用MongoDB部署的连接字符串替换uri字符串。
conn_str = "mongodb+srv://<username>:<password>@<cluster-address>/test?retryWrites=true&w=majority"
# 设置连接超时的时间为500ms(5s)
client = pymongo.MongoClient(conn_str, serverSelectionTimeoutMS=5000)   
try:
    print(client.server_info())                   # 输出服务信息
except Exception:
    print("无法连接到MongoDB服务")                 # 提示异常

1.3.2 默认本地mongoDB数据库连接

import pymongo
client = pymongo.MongoClient()

这个写法相当于

import pymongo
client = pymongo.MongoClient("localhost", 27017)

其中27017是Mongo服务的默认使用端口。

1.3.3 远程服务器mongoDB数据库连接

需要提醒的是使用如阿里云等任意主流云服务器的朋友,在进行远程数据库连接时,比如确保你服务器上配置的数据库端口号时对外开放的才可以从外部访问连接。这里可以登录云服务器提供商控制台进行安全配置以实现相关功能,详细请查询云服务提供商给出的文档。

import pymongo
client = pymongo.MongoClient("8.129.131.210", 27017)

1.4 数据库与集合

在连接口数据库服务后,我们需要使用某个数据库,该数据库下的某个集合,这时我们是通过数据库名和集合名来操作的。

import pymongo
client = pymongo.MongoClient() # 连接到数据库服务
database = client.数据库名     # 数据库对象
collection = database.集合名   # 该数据库下的集合对象

1.5 MongoDB命令与PyMongo方法的对比

基本上把命令中方法命名改成复合Python方法/函数命名习惯的方法名就可以对应了。

MongoDB命令 PyMongo方法
inserOne inser_one
insertMany insertmany
find find
updateOne update_one
updateMony update_mony
deleteOne delete_one
deleteMany delete_many
相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
目录
相关文章
|
2月前
|
NoSQL MongoDB 数据库
python3操作MongoDB的crud以及聚合案例,代码可直接运行(python经典编程案例)
这篇文章提供了使用Python操作MongoDB数据库进行CRUD(创建、读取、更新、删除)操作的详细代码示例,以及如何执行聚合查询的案例。
31 6
|
2月前
|
NoSQL JavaScript Java
Java Python访问MongoDB
Java Python访问MongoDB
22 4
|
4月前
|
存储 监控 数据处理
💻Python高手必备!文件系统操作秘籍,让你的数据存取如臂使指
【7月更文挑战第29天】在数据驱动时代, Python以简洁语法、丰富库生态和强大跨平台能力, 成为数据科学等领域首选。本文探讨Python文件系统操作秘籍, 助力高效数据处理。
47 11
|
4月前
|
索引 Python
Python的列表操作有哪些?
Python的列表操作非常丰富,包括列表的创建、元素的访问、修改、添加、删除、切片、排序等多个方面。
43 12
|
4月前
|
安全 数据安全/隐私保护 Python
|
4月前
|
监控 网络协议 网络安全
SMTP操作使用详解并通过python进行smtp邮件发送示例
SMTP操作使用详解并通过python进行smtp邮件发送示例
126 3
|
4月前
|
数据挖掘 数据处理 Python
🔍深入Python系统编程腹地:文件系统操作与I/O管理,打造高效数据处理流水线
【7月更文挑战第29天】深入Python系统编程腹地:文件系统操作与I/O管理,打造高效数据处理流水线
36 3
|
4月前
|
API Python
Python高手修炼手册:精通文件系统操作,掌控I/O管理,提升编程效率
【7月更文挑战第30天】在 Python 编程中, 文件系统操作与 I/O 管理是连接程序与数据的关键。初学者常因路径错误和权限问题受挫, 而高手能自如管理文件。传统 `os` 和 `os.path` 模块易出错, `pathlib` 提供了更直观的对象导向 API。I/O 方面, 同步操作会阻塞程序, 异步 (如使用 `aiofiles`) 则能大幅提升并发能力。真正的高手不仅掌握 API, 更能预见性能瓶颈并优化代码, 实现高效与优雅。
40 1
|
4月前
|
Serverless 语音技术 开发工具
函数计算操作报错合集之怎么何集成nls tts python sdk
在使用函数计算服务(如阿里云函数计算)时,用户可能会遇到多种错误场景。以下是一些常见的操作报错及其可能的原因和解决方法,包括但不限于:1. 函数部署失败、2. 函数执行超时、3. 资源不足错误、4. 权限与访问错误、5. 依赖问题、6. 网络配置错误、7. 触发器配置错误、8. 日志与监控问题。
下一篇
无影云桌面