【发布时间】:2022-05-11 09:48:14
【问题描述】:
我需要从我的 Python 代码连接到 MongoDB,我唯一拥有的是一个 url。根据mongo URL doc 我可以指定数据库名称:
mongodb://host/db_name
现在我想完全使用从 URL 指定的数据库,不想手动解析它来提取数据库的名称。但是MongoClient 没有访问默认的接口。任何想法如何管理这个?
【问题讨论】:
我需要从我的 Python 代码连接到 MongoDB,我唯一拥有的是一个 url。根据mongo URL doc 我可以指定数据库名称:
mongodb://host/db_name
现在我想完全使用从 URL 指定的数据库,不想手动解析它来提取数据库的名称。但是MongoClient 没有访问默认的接口。任何想法如何管理这个?
【问题讨论】:
PyMongo/MongoClient 提供了一个get_default_database() 方法:
from pymongo import MongoClient
client = MongoClient("mongodb://host/db_name")
db = client.get_default_database()
https://pymongo.readthedocs.io/en/stable/api/pymongo/mongo_client.html
【讨论】:
您可以为此使用 pymongo.uri_parser.parse_uri:
Python 2.7.5 (default, Jul 12 2013, 14:44:36)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> uri = "mongodb://user:pass@example.com/my_database/?w=2"
>>> from pymongo.uri_parser import parse_uri
>>> parse_uri(uri)
{'username': 'user', 'nodelist': [('example.com', 27017)], 'database': 'my_database/',
'collection': None, 'password': 'pass', 'options': {'w': 2}}
在 PyMongo 2.6 中将有一个 get_default_database() 方法。见PYTHON-461
【讨论】:
看起来它根本不起作用。启动时pymongo 转储警告:
UserWarning:URI 中的数据库名称或 authSource 被忽略。
【讨论】:
我从 Dan 的回答中得到了这个错误:
OperationFailure: Authentication failed., full error: {'ok': 0.0, 'errmsg': 'Authentication failed.', 'code': 18, 'codeName': 'AuthenticationFailed'}
我意识到我需要指定身份验证源,因为我的实例需要身份验证。如果你面临同样的问题,请使用这个:
from pymongo import MongoClient
client = MongoClient("mongodb://<USERNAME>:<PASSWORD>@<HOST>/<DEFAULT_DATABASE>?authSource=admin")
db = client.get_default_database()
# Then you may query
db["my_col"].find_one({})
相应地填写<USERNAME>、<PASSWORD>、<HOST>、<DEFAULT_DATABASE>(阅读更多关于MongoDB connection strings的信息)。
您可能在另一个数据库中有authSource,但我认为admin 是默认值。
【讨论】: