2013-03-27 16 views
12

Używam pętli for w pythonie, aby zapętlić wynik zapytania z pymongo. Oto kod:python + pymongo: jak wstawić nowe pole na istniejącym dokumencie w mongo z pętli for

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... 

Mam pytanie brzmi, jak mogę wstawić zmienną myGeolocCountry do nieistniejących dziedzinie geolocCountry na istniejącym dokumencie (b)?

Próbowałem z

b['geolocCountry'] = myGeolocCountry 

ale to nie działa w ogóle, to nawet nie produkują błąd.

Dzięki

Odpowiedz

12

Należy wykonać zapytanie o aktualizację tak:

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

postaram to soo n, dzięki – otmezger

+0

To zadziałało, twoje rozwiązanie ma mały błąd, tho. '" myGeolocCountry "' nie potrzebuje '' ', ponieważ jest zmienną :-) Dzięki – otmezger

2

Musisz użyć funkcji update() w celu aktualizacji rekordów w swojej kolekcji.

z aktualizacją można określić kwerendę (jak masz powyżej collection.find() ale także drugą dict, który określa w jaki sposób chcesz zaktualizować dokumenty znalezione w zapytaniu coś takiego:.

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

sprawdź API dla reszty argumentów.

0

trzeba zapisać kolekcję po aktualizacji.

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