我正在尝试浏览集合中的记录,其中坐标字段中没有经度/纬度信息。使用Google的geocode()
方法我选择的记录包含要转换为坐标的位置信息,然后更新coordinates
字段中的新值,该字段本来是null
。
使用find()
方法,我得到相关记录,但这段代码似乎没有执行,即记录没有用坐标信息更新。这是代码:
cursor = coll.find(
{"$and": [
{"coordinates": {"$type":10}},
{"place": {"$ne": None}}
]},
{"coordinates": 1, "place": 1, "time_normal": 1, "_id": 1}, tailable = True, timeout = False)
while cursor.alive:
counter=0
g = geocoders.Google()
try:
doc = cursor.next()
current_id = doc['_id']
counter+=1
print doc
placeName = doc['place']['full_name']
loc = g.geocode(placeName)
coll.update({"_id" : current_id},{"$set": {"coordinates": loc[1]}})
print doc
time.sleep(0.15)
except (ValueError, geocoders.google.GQueryError):
pass
except StopIteration:
break
我无法理解为什么该领域没有更新。我注意到print counter
返回0。
由于
答案 0 :(得分:1)
夫妻俩:
您可以稍微简化find
查询以删除$and
,因为在查询选择器中自然包含多个字段'并且'是':
cursor = coll.find(
{
{"coordinates": {"$type":10}},
{"place": {"$ne": None}}
},
{"coordinates": 1, "place": 1, "time_normal": 1, "_id": 1},
tailable = True, timeout = False)
但这不应该导致任何问题,并且您的update
电话看起来不错。但是,不要期望doc
调用会修改update
,因为它是find
调用时文档外观的快照。您需要在此时致电find_one({"_id": current_id})
以查看更新结果。
如果它仍然没有更新,请在更新前查看loc[1]
的内容,以确保它符合您的预期。
<强>更新强>
问题很可能是您正在尝试更新导致文档大小增长的上限集合。根据{{3}},这将导致更新失败。