web-dev-qa-db-ja.com

python + pymongo:forループからmongoの既存のドキュメントに新しいフィールドを挿入する方法

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

しかし、それはまったく機能しませんでした、それはエラーさえ生成しません。

ありがとう

16
otmezger

次のような更新クエリを実行する必要があります。

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

コレクション内のレコードを更新するには、関数 update() を使用する必要があります。

Updateを使用すると、クエリを指定できます(上記のcollection.find()と同じですが、クエリで見つかったドキュメントを更新する方法を定義する2番目のdictも提供します。次のようになります。

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

残りの引数についてはAPIを確認してください。

5
Wes

pymongo>の場合

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

複数の更新の場合:

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

pymongo <の場合

上記/前の回答は正しい

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

複数の更新の場合:

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

更新後にコレクションを保存する必要があります。

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)**
0
Satys