选择连接目标
在此页面上
Overview
在本指南中,您可以了解如何使用连接string和 MongoClient
对象连接到不同类型的MongoDB部署。
Atlas
要连接到MongoDB 上的Atlas 部署,请在连接string 中包含以下元素:
Atlas 集群的 URL
MongoDB 用户名
MongoDB 密码
然后,将连接string传递给 MongoClient
构造函数。
提示
按照 Atlas驱动程序连接指南检索连接string 。
当您连接到Atlas时,我们建议使用 Stable API客户端选项,以避免Atlas升级到新版本的MongoDB Server时发生重大更改。 要学习;了解有关 Stable API功能的更多信息,请参阅 Stable API页面。
以下代码展示了如何使用 PyMongo 连接到 Atlas 集群。 该代码还使用 server_api
选项指定stable API版本。
from pymongo import MongoClient from pymongo.server_api import ServerApi # Replace the placeholder with your Atlas connection string uri = "<connection string>" # Create a MongoClient with a MongoClientOptions object to set the Stable API version client = MongoClient(uri, server_api=ServerApi( version='1', strict=True, deprecation_errors=True)) try: # Connect the client to the server (optional starting in v4.7) client.connect() # Send a ping to confirm a successful connection client.admin.command({'ping': 1}) print("Pinged your deployment. You successfully connected to MongoDB!") finally: # Ensures that the client will close when you finish/error client.close()
本地部署
要连接到本地 MongoDB 部署,请使用localhost
作为主机名。 默认情况下, mongod
进程在端口27017上运行,但您可以根据部署进行自定义。
以下代码展示了如何使用 PyMongo 连接到本地 MongoDB 部署:
from pymongo import MongoClient uri = "mongodb://localhost:27017/" client = MongoClient(uri)
副本集
要连接到副本集,请在连接IP 中指定副本集成员的主机名(或string 地址)和端口号。
以下代码展示了如何使用PyMongo连接到包含三个主机的副本集:
from pymongo import MongoClient client = MongoClient("mongodb://host1:27017,host2:27017,host3:27017")
如果无法提供副本集中主机的完整列表,则可以指定副本集中的一个或多个主机,并指示 PyMongo 执行自动发现以查找其他主机。 要指示驱动程序执行自动发现,请执行以下操作之一:
将副本集的名称指定为
replicaSet
参数的值。将
false
指定为directConnection
参数的值。在副本集中指定多个主机。
在以下示例中,驱动程序使用样本连接 URI 连接到 MongoDB 副本集 sampleRS
,该副本集在三个不同主机(包括 host1
)的端口 27017
上运行:
from pymongo import MongoClient uri = "mongodb://host1:27017/?replicaSet=sampleRS" client = MongoClient(uri)
PyMongo在客户端的 localThresholdMS
值内可访问的部署之间均匀地负载均衡操作。 要进一步学习;了解PyMongo如何在多个MongoDB部署之间实现操作负载均衡,请参阅 自定义服务器选择指南。
注意
MongoClient
构造函数是非阻塞的。 连接到副本集时,构造函数会立即返回,而客户端会使用后台线程连接到副本集。
如果构造 MongoClient
并立即打印其 nodes
属性的string表示形式,则当客户端连接到副本集成员时,列表可能为空。
初始化
要初始化副本集,您必须直接连接到单个成员。 为此,请将directConnection
连接选项设置为True
。 您可以通过两种方式执行此操作:将参数传递给 MongoClient
构造函数,或通过连接string中的参数。
from pymongo import MongoClient client = MongoClient("mongodb://<hostname>:<port>", directConnection=True)
from pymongo import MongoClient uri = ("mongodb://<hostname>:<port>/?" "directConnection=true") client = MongoClient(uri)
DNS 服务发现
要使用 DNS 服务发现来查找要连接的服务的 DNS SRV记录,请在连接字符串中指定 SRV 连接格式。此外,如果启用SRV 连接格式, PyMongo会自动重新扫描新主机,而无需更改客户端配置。
以下代码显示了使用 SRV 连接格式的连接字符串:
uri = "mongodb+srv://<hostname>/"
要学习;了解有关 SRV 连接格式的更多信息,请参阅MongoDB Server手册中的 SRV 连接格式条目。
故障排除
MongoDB Server报告 Wire 版本 X, PyMongo需要 Y
如果您尝试连接到 MongoDB Server v 3.6或更早版本,PyMongo 可能会引发以下错误:
pymongo.errors.ConfigurationError: Server at localhost:27017 reports wire version 6, but this version of PyMongo requires at least 7 (MongoDB 4.0).
当驾驶员版本对于其所连接的服务器来说太新时,就会出现这种情况。 要解决此问题,您可以执行以下操作之一:
将MongoDB 部署升级到 v4.0 或更高版本。
降级到PyMongo 4.10 或更早版本,以支持MongoDB Server v3.6 及更高版本。
降级到PyMongo v3.x,支持MongoDB Server v2.6 及更高版本。
自动重新连接
AutoReconnect
异常表示发生了故障转移。 这意味着 PyMongo 已失去与副本集的原始主节点成员的连接,并且其最后一个操作可能已失败。
发生此错误时,PyMongo 会自动尝试为后续操作查找新的主节点成员。 要处理该错误,您的应用程序必须执行以下操作之一:
重试可能失败的操作
继续运行,但需了解操作可能失败
重要
PyMongo 会对所有操作引发AutoReconnect
错误,直到副本集选出新的主节点成员。
使用隧道从 PyMongo 访问 MongoDB 时超时
如果您尝试通过 SSH 隧道连接到 MongoDB 副本集,您会收到以下错误:
File "/Library/Python/2.7/site-packages/pymongo/collection.py", line 1560, in count return self._count(cmd, collation, session) File "/Library/Python/2.7/site-packages/pymongo/collection.py", line 1504, in _count with self._socket_for_reads() as (connection, slave_ok): File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/contextlib.py", line 17, in __enter__ return self.gen.next() File "/Library/Python/2.7/site-packages/pymongo/mongo_client.py", line 982, in _socket_for_reads server = topology.select_server(read_preference) File "/Library/Python/2.7/site-packages/pymongo/topology.py", line 224, in select_server address)) File "/Library/Python/2.7/site-packages/pymongo/topology.py", line 183, in select_servers selector, server_timeout, address) File "/Library/Python/2.7/site-packages/pymongo/topology.py", line 199, in _select_servers_loop self._error_message(selector)) pymongo.errors.ServerSelectionTimeoutError: localhost:27017: timed out
发生这种情况是因为 PyMongo 使用isMaster
命令的响应发现副本集成员,其中包含其他副本集成员的地址和端口。 但是,您无法通过 SSH 隧道访问这些地址和端口。
相反,您可以使用directConnection=True
选项和 SSH 隧道直接连接到单个 MongoDB 节点。
API 文档
要了解有关在 PyMongo 中创建MongoClient
对象的更多信息,请参阅以下 API 文档: