0

我正在尝试浏览集合中的记录,其中坐标字段中没有经度/纬度信息。使用 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。

谢谢

4

1 回答 1

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通话看起来不错。但是,不要期望docupdate调用修改,因为它是调用时文档外观的快照find。您需要find_one({"_id": current_id})在此时致电以查看更新结果。

如果它看起来仍然没有更新,请查看更新loc[1]前的内容,以确保它是您所期望的。

更新

问题很可能是您正在尝试更新导致文档大小增加的上限集合。根据文档,这将导致更新失败。

于 2012-12-20T14:51:44.833 回答