如何使用新值更新MongoDB中的字段

时间:2012-12-20 14:30:53

标签: python mongodb pymongo

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

由于

1 个答案:

答案 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}},这将导致更新失败。