使用 pymongo
连接到需要验证的 MongoDB 数据库,需要提供额外的认证信息。通常情况下,这包括数据库名称、用户名以及密码。
首先,确保你已经安装了 pymongo
。如果没有,请通过 pip 安装它:
pip install pymongo
接下来,你可以使用如下 Python 代码来连接到一个需要身份验证的 MongoDB 数据库:
from pymongo import MongoClient
# MongoDB 服务器地址和端口
host = 'your_mongodb_server'
port = 27017
# 链接字符串方式(推荐)
client = MongoClient(f'mongodb://{username}:{password}@{host}:{port}/?authSource=admin')
# 或者使用 MongoClient 的参数形式
# client = MongoClient(host, port, username=username, password=password, authSource='admin')
# 选择数据库
db = client['your_database_name']
# 测试连接,例如列出所有集合
print(db.list_collection_names())
在这个例子中:
your_mongodb_server
应该替换为你的 MongoDB 服务器地址。username
和 password
分别是用于登录数据库的用户名和密码。authSource
参数指定了用户凭据所在的数据库。如果用户的凭据是在 admin
数据库中创建的,则应将其设置为 'admin'
。使用以上代码测试报错如下:
Could not reach any servers in [('192.168.1.18', 30000)]. Replica set is configured with internal hostnames or IPs?, Timeout: 30s, Topology Description: <TopologyDescription id: 6858b84e2c319e1ca7bbfca5, topology_type: ReplicaSetNoPrimary, servers: [<ServerDescription ('192.168.1.18', 30000) server_type: Unknown, rtt: None, error=NetworkTimeout('192.168.1.18:30000: timed out (configured timeouts: socketTimeoutMS: 20000.0ms, connectTimeoutMS: 20000.0ms)')>]>
这个错误信息表明 pymongo
无法连接到指定的 MongoDB 实例(位于 192.168.1.18:30000
),可能的原因包括但不限于:
192.168.1.18
这个 IP 地址。可以尝试使用 ping
或者 telnet
来测试该地址和端口是否可达。30000
端口上。socketTimeoutMS
和 connectTimeoutMS
都设置为 20 秒。你可以尝试增加这些超时时间,尤其是当你知道网络延迟较高时。要解决这个问题,你可以尝试以下步骤:
socketTimeoutMS
和 connectTimeoutMS
设置为更长的时间,以便给连接更多的尝试时间。 参数用于指定是否直接连接到 MongoDB 实例,而不经过负载均衡或副本集的自动发现过程。当你明确知道要连接的是一个独立的 MongoDB 实例而非副本集成员时,使用 directConnection=true
可以加快连接速度并避免不必要的副本集探测。
directConnection
在 pymongo
中从 pymongo
3.11 版本开始支持 directConnection
参数。你可以通过在连接字符串中添加 directConnection=true
或者在 MongoClient
初始化时作为参数传入来设置它。
from pymongo import MongoClient
# 使用带有 directConnection 参数的连接字符串
client = MongoClient("mongodb://username:password@hostname:port/?directConnection=true&authSource=admin")
# 测试连接
try:
client.admin.command('ping')
print("Successfully connected to the server")
except Exception as e:
print(e)
在这个例子中,我们直接连接到位于 hostname:port
的单一 MongoDB 实例,并且通过 directConnection=true
明确告诉驱动程序这是一个单实例连接而不是副本集的一部分。
如果你更倾向于编程方式设置连接选项,也可以在创建 MongoClient
对象时传递 directConnection
参数:
from pymongo import MongoClient
# 作为 MongoClient 的参数传入
client = MongoClient(host="hostname", port=27017, username="username", password="password", authSource="admin", directConnection=True)
# 测试连接
try:
client.admin.command('ping')
print("Successfully connected to the server")
except Exception as e:
print(e)
directConnection=true
。如果错误地将此参数应用于副本集连接,可能会导致无法正确识别主节点或从节点。pymongo
版本支持 directConnection
参数。可以通过运行 pip show pymongo
来检查当前安装的版本号。admin
)。原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。