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

ピモンゴ > 3の場合

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

複数の更新の場合:

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

ピモンゴ < 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()、クエリで見つかったドキュメントを更新する方法を定義する 2 つ目の dict も提供します。次のようなものです:

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 に答える