当前位置 博文首页 > jcLee95的博客:MongoDB - 使用Python操作MongoDB

    jcLee95的博客:MongoDB - 使用Python操作MongoDB

    作者:[db:作者] 时间:2021-09-18 15:44

    使用Python操作MongoDB数据库

    CSDN用户名:jcLee95


    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(默认值)、javaLegacycsharpLegacystandard' 和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:要附加到初始“ c h a n g e S t r e a m ” 阶 段 的 聚 合 管 道 阶 段 列 表 。 并 非 所 有 管 道 阶 段 在 ‘ changeStream”阶段的聚合管道阶段列表。并非所有管道阶段在` changeStreamchangeStream `'阶段后都有效。
    • 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方法
    inserOneinser_one
    insertManyinsertmany
    findfind
    updateOneupdate_one
    updateMonyupdate_mony
    deleteOnedelete_one
    deleteManydelete_many
    cs