python + pymongo:如何在for循环中在mongo中的现有文档中插入新字段

时间:2013-03-27 18:04:52

标签: python mongodb insert pymongo

我在python中使用for循环来循环遍历pymongo的查询结果。这是代码:

from pymongo import MongoClient
connection = MongoClient()
db = connection.Test

myDocs = db.Docs.find( { "geolocCountry" : { "$exists" : False } } )

for b in myDrives:
    my_lat = b['TheGpsLog'][0]['latitude']
    my_long = b['TheGpsLog'][0]['longitude']

    myGeolocCountry = DoReverseGeocode(lat_start,long_start) 
    #    Here I perform a reverse geocoding, it does not matter for this example. 
    #    The important thing is: it returns a string, like 'US', 'UK', etc...

我的问题是,如何将变量myGeolocCountry插入现有文档(geolocCountry)的非现有字段b

我试过

b['geolocCountry'] = myGeolocCountry

但它根本不起作用,它甚至不会产生错误。

由于

4 个答案:

答案 0 :(得分:17)

您应该执行如下更新查询:

db.Doc.update({"_id": b["_id"]}, {"$set": {"geolocCountry": myGeolocCountry}})

答案 1 :(得分:4)

您必须使用函数update()才能更新集合中的记录。

使用更新,您可以指定查询(就像上面的collection.find()一样,但也提供了第二个dict,它定义了如何更新查询中找到的文档。 类似的东西:

db.Docs.update({"geolocCountry":{"$exists":False}}, {"$set": "geolocCountry": myGeolocCountry})

查看其余参数的API。

答案 2 :(得分:2)

对于 pymongo> 3

db.Doc.update_one({"_id": b["_id"]}, {"$set": {"geolocCountry": myGeolocCountry}})

如果有多个更新:

db.Doc.update_many({"geolocCountry": {"$exists": False}}, {"$set": {"geolocCountry": myGeolocCountry}})

对于 pymongo <3

以上/先前的答案是正确的

db.Doc.update({"_id": b["_id"]}, {"$set": {"geolocCountry": myGeolocCountry}})

如果有多个更新:

db.Doc.update({"geolocCountry": {"$exists": False}}, {"$set": {"geolocCountry": myGeolocCountry}})

答案 3 :(得分:0)

您需要在更新后保存该集合。

for b in myDrives:
    my_lat = b['TheGpsLog'][0]['latitude']
    my_long = b['TheGpsLog'][0]['longitude']

    myGeolocCountry = DoReverseGeocode(lat_start,long_start)

    b['geolocCountry'] = myGeolocCountry
    **db.Docs.save(b)**