繁体   English   中英

pymongo db.collection.update operationFailure

[英]pymongo db.collection.update operationFailure

我有一大堆文档,我正在尝试使用pymongo.update函数进行更新。 我发现所有属于某个多边形的文档并更新了使用“update_value”找到的所有点。

for element in geomShapeCollection:
    db.collectionName.update({"coordinates":{"$geoWithin":{"$geometry":element["geometry_part"]}}}, {"$set":{"Update_key": update_value}}, multi = True, timeout=False)

对于较小的集合,此命令按预期工作。 在最大的数据集中,该命令适用于70-80%的数据,然后抛出错误:

pymongo.errors.OperationFailure:游标ID'428737620678732339'在服务器上无效

pymongo文档告诉我,这可能是由于超时问题。

如果MongoDB中的游标已经打开了很长时间而没有对它们执行任何操作,则它们可以在服务器上超时。

通过pymongo文档阅读, find()函数有一个超时的布尔标志。

find(spec=None, fields=None, skip=0, limit=0, timeout=True, snapshot=False, tailable=False, _sock=None, _must_use_master=False,_is_command=False)

但是更新功能似乎没有这个:

update(spec, document, upsert=False, manipulate=False, safe=False, multi=False)

有没有办法为更新功能设置此超时标志? 有什么办法可以改变这个,这样我就不会收到这个OperationFailure错误吗? 假设这是一个超时错误,我是正确的,因为pymongo 声明它会抛出此错误

数据库操作失败时引发。

经过一些研究和大量实验后,我发现外部循环光标导致了错误。

for element in geomShapeCollection:

geomShapeCollection是mongodb集合的游标。 geoShapeCollection中有几个元素会丢失大量元素,因为这些更新需要花费相当长的时间才能关闭geomShapeCollection游标。

问题不在于更新功能。 将(timeout = False)添加到外部游标可以解决此问题。

for element in db.geomShapeCollectionName.find(timeout=False):
    db.collectionName.update({"coordinates":{"$geoWithin":{"$geometry":element["geometry_part"]}}}, {"$set":{"Update_key": update_value}}, multi = True, timeout=False)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM