21

我在 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的非现有字段中?geolocCountryb

我试过了

b['geolocCountry'] = myGeolocCountry

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

谢谢

4

4 回答 4

32

您应该像这样执行更新查询:

db.Doc.update({"_id": b["_id"]}, {"$set": {"geolocCountry": myGeolocCountry}})
于 2013-03-27T18:11:15.210 回答
12

对于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}})
于 2018-12-03T13:48:14.033 回答
6

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

使用 update 您可以指定一个查询(就像您在上面所做的一样,collection.find()但还提供了第二个字典,用于定义您希望如何更新在查询中找到的文档。例如:

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

查看 API 以了解其余参数。

于 2013-03-27T18:12:08.107 回答
3

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

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)**
于 2015-04-18T23:02:33.033 回答