标签: pymongo-3.x

为什么PyMongo 3会给出ServerSelectionTimeoutError?

我正在使用:

  • Python 3.4.2
  • PyMongo 3.0.2
  • mongolab运行mongod 2.6.9
  • uWSGI 2.0.10
  • CherryPy 3.7.0
  • nginx 1.6.2

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 mongodb uwsgi mlab pymongo-3.x

34
推荐指数
6
解决办法
3万
查看次数

PyMongo [SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败:无法获取本地颁发者证书

我正在使用 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 时才需要,但我不是。

所以是的,我现在有点陷入困境。

ssl mongodb python-3.x pymongo-3.x mongodb-atlas

22
推荐指数
2
解决办法
2万
查看次数

如何在pymongo连接中输入密码?

我的问题是如何通过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_\@_' …

python authentication mongodb pymongo-3.x

16
推荐指数
2
解决办法
8802
查看次数

如何使用pymongo设置Mongodb的连接超时?

我尝试设置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)

mongodb pymongo pymongo-3.x

12
推荐指数
1
解决办法
5945
查看次数

为什么 PyMongo count_documents 比 count 慢?

db['TF']我大约有60万条记录。

我需要获取记录的数量。

如果我运行db['TF'].count(),它会立即返回。

如果我运行db['TF'].count_documents({}),那么在我得到结果之前需要很长时间。

但是,该count方法将被弃用。

那么,如何在使用时快速获取数量count_documents呢?有没有我错过的一些论点?

我已经阅读了文档和代码,但没有找到。

非常感谢!

mongodb pymongo mongodb-query pymongo-3.x

11
推荐指数
1
解决办法
1万
查看次数

在Django + uWsgi项目中运行时,PyMongo查找返回空/部分游标

我们使用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.pywith 运行APIDEBUG=False在这种情况下,我们在一段时间后再次遇到问题.

我们无法弄清楚问题是什么以及如何解决.我们可以想到的一个原因是Django在完成之前关闭了pymongo的连接.因为返回的结果是有效的JSON.

我们的堆栈是:

  • nginx(未启用缓存)
  • uWsgi
  • MemCached(在调试过程中禁用)
  • Django(python 3上的v1.8)
  • PyMongo(v3.0.3)

非常感谢您的帮助.

更新:

Mongo版本:

db version v3.0.7
git version: 6ce7cbe8c6b899552dadd907604559806aa2e9bd
Run Code Online (Sandbox Code Playgroud)
  • 我们正在运行单个mongod实例.没有分片/复制.
  • 我们正在使用此代码段创建连接:

    con = MongoClient('localhost',27017)

更新2

Pymongo问题跟踪器中的主题线程.

django mongodb pymongo pymongo-3.x

10
推荐指数
1
解决办法
1058
查看次数

如何在没有迭代的情况下计算pymongo聚合游标

我想在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)

有没有办法跳过上面的迭代?

python mongodb pymongo-3.x

10
推荐指数
1
解决办法
5172
查看次数

Pymongo $在查询中不起作用

在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)

我在这里错过了什么吗?

python mongodb pymongo pymongo-3.x

9
推荐指数
1
解决办法
9409
查看次数

如何使用 pymongo 将集合转储到 json 文件

我正在尝试将集合转储到 .json 文件,但在查看 pymongo 教程后,我找不到任何与之相关的内容。

教程链接:https : //api.mongodb.com/python/current/tutorial.html

python json mongodb pymongo-3.x

7
推荐指数
2
解决办法
1万
查看次数

Python pyodbc.row 列出

我正在尝试创建一个 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 中完成。我错过了什么?

python sql-server pymongo-3.x

7
推荐指数
1
解决办法
1万
查看次数