¿Cómo actualizar valores usando pymongo?

Tengo una colección mongodb en este formulario:

{id=ObjectId(....),key={dictionary of values}} where dictionary of values is {'a':'1','b':'2'.....} 

Que el diccionario de valores sea 'd' . Necesito actualizar los valores de la clave en la 'd' . es decir, quiero cambiar 'a':'1' a 'a':'2' ¿Cómo puedo hacer esto en pymongo?

El código va algo como esto:

 productData is a collection in mongoDB for p in productData.find(): for k,v in p.iteritems(): value=v['a'] value=value+1 v['a']=value 

Ahora refleja el nuevo valor en el productData.

Esto es lo que he intentado e introduce un nuevo par clave-valor en lugar de actualizar el

 for p in productData.find(): for k,v in p.iteritems(): value=v['a'] value=value+1 v['a']=value productData.update({'_id':mongoId},{"$set":{'d.a':'100'}},upsert=False) 

Puede usar la syntax de $ set si desea establecer el valor de un documento en un valor arbitrario. Esto actualizará el valor si el atributo ya existe en el documento o lo creará si no existe. Si necesita establecer un solo valor en un diccionario como lo describe, puede usar la notación de puntos para acceder a los valores secundarios.

Si p es el objeto recuperado:

 existing = p['d']['a'] 

Para versiones de pymongo <3.0

 db.ProductData.update({ '_id': p['_id'] },{ '$set': { 'd.a': existing + 1 } }, upsert=False, multi=False) 

Para versiones pymongo> = 3.0

 db.ProductData.update_one({ '_id': p['_id'] },{ '$set': { 'd.a': existing + 1 } }, upsert=False) 

Sin embargo, si solo necesita incrementar el valor, este enfoque podría presentar problemas cuando se puedan ejecutar varias solicitudes simultáneamente. En su lugar, debe utilizar la syntax de $ inc:

Para versiones de pymongo <3.0:

 db.ProductData.update({ '_id': p['_id'] },{ '$inc': { 'd.a': 1 } }, upsert=False, multi=False) 

Para las versiones de pymongo> = 3.0:

 db.ProductData.update_one({ '_id': p['_id'] },{ '$inc': { 'd.a': 1 } }, upsert=False) 

Esto asegura que tus incrementos siempre sucederán.

Con mi versión pymongo: 3.2.2 tuve que hacer lo siguiente

 from bson.objectid import ObjectId import pymongo client = pymongo.MongoClient("localhost", 27017) db = client.mydbname db.ProductData.update_one({ '_id': ObjectId(p['_id']['$oid']) },{ '$set': { 'd.a': existing + 1 } }, upsert=False) 

en python, los operadores deben estar entre comillas: db.ProductData.update ({‘fromAddress’: ‘ http: // localhost: 7000 / ‘}, {“$ set”: {‘fromAddress’: ‘ http: // localhost: 5000 / ‘}}, {“multi”: Verdadero})