我有大量文档,我正在尝试使用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
数据库操作失败时引发。
答案 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)