pymongo db.collection.update operationFailure

时间:2013-10-24 00:24:47

标签: python mongodb pymongo

我有大量文档,我正在尝试使用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() function有一个超时的布尔标志。

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 function似乎没有:

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

有没有办法为更新功能设置此超时标志?有什么办法可以改变这个,这样我就不会收到这个OperationFailure错误吗?我是否正确假设这是一个超时错误,如pymongo states that it throws this error when

  

数据库操作失败时引发。

1 个答案:

答案 0 :(得分:3)

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

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)