pymongo 熟悉 mongo 的大佬帮忙看一下错误

2019-01-28 15:41:17 +08:00
 kidlfy
'''
with MongoHandler.create() as base:
base['media']['media_data_{}'.format(kind)].insert(post)
self.logger.info("inserted to Media_data_{}".format(kind))

'''

操作 mongo 库只有这种插入的操作,但时不时会报如下错误:
'''
Cannot run getMore on cursor 112765575416, which was created in session 809cd1d1-d8bd-4dba-a80d-14868b85446f - 47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=, in session e9ffe991-5468-4a4a-a1b6-9ff5be9406c0 - 47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=

'''
度娘没查到,跪求大佬指点
2044 次点击
所在节点    Python
18 条回复
kidlfy
2019-01-28 15:41:54 +08:00
MongoHandler.create() 相当于 mongo 的一个 client
warcraft1236
2019-01-28 15:49:33 +08:00
pymongo 好像不这么用吧......
ChristopherWu
2019-01-28 15:50:18 +08:00
@kidlfy `Cannot run getMore on cursor `这个错误通常是 mongo 驱动( pymongo )报的,在 find 完后,mongod 会给一个 cursor 游标 给驱动,驱动再用 getMore 的方法去拿更多的数据。

你看看你有啥操作涉及到这部分的?感觉你不是在做正常的 insert
yongzhong
2019-01-28 15:50:34 +08:00
操作 mongo 不需要每次都创建 client 吧,常用方式是
client = MongoClient('HOST','PORT')

db = client['dbname']

db1 = db['aaa']
db2 = db['bbb']

然后其他地方直接调用 db1.insert_one()就好了,你的报错看上去是竞争问题
zhouxuchen
2019-01-28 15:56:06 +08:00
pymongo 真的是这么用的么……

https://api.mongodb.com/python/current/tutorial.html
kidlfy
2019-01-28 15:57:01 +08:00
@ChristopherWu 我是有个 find 的操作,但只是判断了一下 find.count() 是否等于 0 除此之外就没有了
kidlfy
2019-01-28 15:59:58 +08:00
@zhouxuchen 没懂 我错在哪了 和文档一样的啊 我这个只是把 client 封装成了类的静态方法
Vegetable
2019-01-28 16:01:24 +08:00
从报错信息和你的代码来看你是创建了多个连接导致的问题,因为没这么用过所以也没见过这个问题

我建议你在 Mongohandler.create()返回的 base 做成单例,使用一个 client 而不要用多个,应该能解决这个问题
janxin
2019-01-28 16:17:41 +08:00
看起来像是 cursor 复用了吧...
kidlfy
2019-01-28 16:28:58 +08:00
@Vegetable 刚排查出了错误,根本原因是有个返回值在 cursor 结束之后调用了,不是多个连接的原因,感谢
kidlfy
2019-01-28 16:29:24 +08:00
@ChristopherWu 感谢大佬 解决了谢谢
ChristopherWu
2019-01-28 16:34:49 +08:00
@kidlfy 怎么解决的呀?
kidlfy
2019-01-28 16:37:48 +08:00
@ChristopherWu 在 find 之后有个 return 操作 但 cursor 结束了 就改了下这部分
aaa5838769
2019-01-28 16:38:07 +08:00
你代码写错了把- -
ChristopherWu
2019-01-28 16:48:31 +08:00
@kidlfy 能不能分享一下你在干啥(以及代码)? 我觉得其他人都很好奇你在干嘛,是不是用错了 mongo (我觉得不是的)
kidlfy
2019-01-28 17:10:50 +08:00
@ChristopherWu 我在做实时新闻的爬取,开了协程,mongo 只是用来去重存储,之所以用 with 并且每次创建一个 client 只是为了保证安全,就这样。。。。
ChristopherWu
2019-01-28 17:17:09 +08:00
@kidlfy 那为啥你要手动处理 cursor 啊?这个不是 pymongo 处理好的吗?
kidlfy
2019-01-28 17:18:34 +08:00
@ChristopherWu 我没手动处理啊。。。是我代码的问题。。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/531270

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX