我正在使用:
uWSGI启动参数:
--socket 127.0.0.1:8081 --daemonize --enable-threads --threads 2 --processes 2
Run Code Online (Sandbox Code Playgroud)
我设置我的MongoClient ONE时间:
self.mongo_client = MongoClient('mongodb://user:pw@host.mongolab.com:port/mydb')
self.db = self.mongo_client['mydb']
Run Code Online (Sandbox Code Playgroud)
我尝试将一个JSON字典保存到MongoDB:
result = self.db.jobs.insert_one(job_dict)
Run Code Online (Sandbox Code Playgroud)
它通过单元测试工作,该测试执行与mongodb相同的代码路径.但是当我使用HTTP POST通过CherryPy和uWSGI执行时,我得到了这个:
pymongo.errors.ServerSelectionTimeoutError: No servers found yet
Run Code Online (Sandbox Code Playgroud)
为什么我在通过CherryPy和uWSGI运行时会看到这种行为?这可能是PyMongo 3中的新线程模型吗?
更新:
如果我通过使用CherryPy内置服务器运行没有uWSGI和nginx,那么就insert_one()
可以了.
更新1/25美国东部时间下午4:53:
在PyMongo中添加一些调试后,似乎topology._update_servers()
知道服务器'myserver-a.mongolab.com'的server_type = 2.但是server_description.known_servers()
服务器'myserver.mongolab.com'的server_type = 0
这导致以下堆栈跟踪:
result = self.db.jobs.insert_one(job_dict)
File "/usr/local/lib/python3.4/site-packages/pymongo/collection.py", line 466, in insert_one
with self._socket_for_writes() as sock_info:
File "/usr/local/lib/python3.4/contextlib.py", line 59, in __enter__
return next(self.gen)
File …
Run Code Online (Sandbox Code Playgroud) 我正在使用 Python 3.9.5 和 PyMongo 3.11.4。我的MongoDB数据库的版本是4.4.6。我使用的是 Windows 8.1
我正在学习 MongoDB,并且在 Atlas 中设置了一个集群并连接到该集群。每当我尝试将文档插入集合中时,ServerSelectionTimeoutError
都会引发 a ,并且在其括号内有几个[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate
.
PyMongo 文档中的TLS 错误故障排除并没有太多帮助,因为它们只为 Linux 和 macOS 用户提供了提示。
值得一提的是,如果我tlsAllowInvalidCertificates=True
在初始化时设置MongoClient
,一切都会正常。这听起来不安全,虽然我正在开发一个小项目,但我仍然想养成良好的习惯,并且不要凌驾于任何现有的安全措施之上,所以我希望有一种替代方案。
从我所做的所有搜索来看,我猜测我丢失了某些证书,或者 Python 无法找到它们。我已经研究过这个certifi
包,但是文档的这一部分看起来只有在我使用 Python 2.x 时才需要,但我不是。
所以是的,我现在有点陷入困境。
我的问题是如何通过pymongo验证mongodb身份验证的用户名密码?.
我正在尝试使用PyMongo 3.2.2和包含用户和密码的URL连接到MongoDB实例,如MongoDB Docs中所述.不同的是我使用的密码包含'@'.
起初我只是试图连接而不逃避,像这样:
prefix ='mongodb://'
user ='user:passw_with _ @ _'
suffix ='@ 127.0.0.1:27001 /'
conn = pymongo.MongoClient(前缀+用户+后缀)
当然我得到以下错误:
InvalidURI: ':' or '@' characters in a username or password must be escaped according to RFC 2396.
Run Code Online (Sandbox Code Playgroud)
所以我尝试转义用户:使用urllib.quote()传递部分,如下所示:
prefix ='mongodb://'
user = urllib.quote('user:passw_with _ @ _')
suffix ='@ 127.0.0.1:27001 /'
conn = pymongo.MongoClient(前缀+用户+后缀)
但后来我得到了:
OperationFailure: Authentication failed.
Run Code Online (Sandbox Code Playgroud)
(重要的是说使用GUI MongoDB管理工具(Robomongo,如果这很重要)我可以使用(真实)地址和凭证连接到MongoDB.)
在上面的代码中打印用户变量生成一个'user:passw_with_%40_'
字符串(即'@'变为'%40')并根据维基百科那是预期的转义.
我甚至试图逃逸单,双反斜杠(中@ user = 'user:passw_with_\\@_'
和user = 'user:passw_with_\@_' …
我尝试设置connectTimeoutMS
并设置socketTimeoutMS
为较低的值,但在脚本超时前仍需要大约20秒.我没有正确使用这些选项吗?我希望脚本在5秒后退出.
def init_mongo():
mongo_connection = MongoClient('%s' %MONGO_SERVER, connectTimeoutMS=5000, socketTimeoutMS=5000)
if mongo_connection is None:
return
try:
<code>
except:
<code>
Run Code Online (Sandbox Code Playgroud) 在db['TF']
我大约有60万条记录。
我需要获取记录的数量。
如果我运行db['TF'].count()
,它会立即返回。
如果我运行db['TF'].count_documents({})
,那么在我得到结果之前需要很长时间。
但是,该count
方法将被弃用。
那么,如何在使用时快速获取数量count_documents
呢?有没有我错过的一些论点?
我已经阅读了文档和代码,但没有找到。
非常感谢!
我们使用Django
&mongoDB
(PyMongo
驱动程序)开发了一个REST API .问题是,在对API端点的一些请求中,PyMongo
游标返回一个部分响应,其中包含的文档少于应有的数量(但它是一个完全有效的JSON文档).
让我用我们的一个观点的例子来解释它:
def get_data(key):
return collection.find({'key': key}, limit=24)
def my_view(request):
key = request.POST.get('key')
query = get_data(key)
res = [app for app in query]
return JsonResponse({'list': res})
Run Code Online (Sandbox Code Playgroud)
我们确信有超过8000个文档与查询匹配,但在某些调用中,我们得到的结果少于24个(甚至为零).我们调查的第一个问题是MongoClient
我们的代码中有多个定义.通过解决这个问题,问题的发生次数减少了,但我们仍然在很多电话中都有这种情况.
在所有这些调查之后,我们设计了一个测试,其中我们同时向服务器发出了16个异步请求.通过这种方法,我们可以重现这个问题.在这16个请求中,每个请求中有6-8个具有部分结果.运行此测试后,我们将uWsgi
进程数减少到6并重新启动服务器.所有结果都很好,但在服务器上施加了另一个重负载后,问题再次出现.此时,我们重新启动了uwsgi服务,一切都很好.通过最后一个实验,我们现在有一个线索,即当uwsgi服务开始运行时,一切正常,但经过一段时间和重负载后,服务器开始再次返回部分或空的结果.我们最近的调查是使用python manage.py
with 运行APIDEBUG=False
在这种情况下,我们在一段时间后再次遇到问题.
我们无法弄清楚问题是什么以及如何解决.我们可以想到的一个原因是Django在完成之前关闭了pymongo的连接.因为返回的结果是有效的JSON.
我们的堆栈是:
非常感谢您的帮助.
Mongo版本:
db version v3.0.7
git version: 6ce7cbe8c6b899552dadd907604559806aa2e9bd
Run Code Online (Sandbox Code Playgroud)
mongod
实例.没有分片/复制.我们正在使用此代码段创建连接:
con = MongoClient('localhost',27017)
我想在pymongo 3.0+版本中获得聚合光标中的记录总数.有没有办法在不迭代光标的情况下获得总计数?
cursor = db.collection.aggregate([{"$match": options},{"$group": {"_id": groupby,"count": {"$sum":1}}} ])
cursorlist = [c for c in cursor]
print len(cursorlist)
Run Code Online (Sandbox Code Playgroud)
有没有办法跳过上面的迭代?
在Pymongo $in
查询中看到一些奇怪的行为.查找符合以下查询的记录:
speciesCollection.find({"SPCOMNAME":{"$in":['paddlefish','lake sturgeon']}})
Run Code Online (Sandbox Code Playgroud)
查询不返回任何记录.
如果我将它更改为find_one,它将返回Lake Sturgeon的最后一个值.该字段是一个带有一个vaule的文本.所以我正在寻找与白鲟或鲟鱼湖相匹配的记录.
它在Mongo Shell中运行良好,如下所示:
speciesCollection.find({SPCOMNAME:{$in: ['paddlefish','lake strugeon']}},{_id:0})
Run Code Online (Sandbox Code Playgroud)
这是shell的结果
{ "SPECIES_ID" : 1, "SPECIES_AB" : "LKS", "SPCOMNAME" : "lake sturgeon", "SP_SCINAME" : "Acipenser fulvescens
{ "SPECIES_ID" : 101, "SPECIES_AB" : "PAH", "SPCOMNAME" : "paddlefish", "SP_SCINAME" : "Polyodon spathula" }
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么吗?
我正在尝试将集合转储到 .json 文件,但在查看 pymongo 教程后,我找不到任何与之相关的内容。
我正在尝试创建一个 python 脚本来从 SQLServer 数据库转换为 Mongodb。在来自 SQLServer 的查询中,我使用该FOR JSON AUTO
方法将数据作为 JSON 返回。当我使用以下代码时,我无法为 pymongo 的 var 获取正确的类型以正确插入数据。
client = MongoClient('localhost', 27017)
db = client.npnrd_test
collection = db.certs
sql_file = open('./sql/F1043_Tract.sql')
sql_d = sql_file.read()
sql_file.close()
cursor.execute(sql_d)
cert_data = cursor.fetchone()
cert_list = cert_data[0]
print(cert_list)
print(type(cert_list))
Run Code Online (Sandbox Code Playgroud)
当我得到 cert_list 的“类型”时,它是一个类“str”而不是类列表,因为它应该用于 pymongo。如果我打印数据并将其直接复制并粘贴到新变量中,则它是一个类型类列表并在 pymongo 中完成。我错过了什么?
pymongo-3.x ×10
mongodb ×9
python ×6
pymongo ×4
django ×1
json ×1
mlab ×1
python-3.x ×1
sql-server ×1
ssl ×1
uwsgi ×1