¿Cómo actualizo un documento Mongo después de insertarlo?

Digamos que inserto el documento.

post = { some dictionary } mongo_id = mycollection.insert(post) 

Ahora, digamos que quiero agregar un campo y actualizarlo. ¿Cómo puedo hacer eso? Esto no parece funcionar …

 post = mycollection.find_one({"_id":mongo_id}) post['newfield'] = "abc" mycollection.save(post) 

En pymongo puedes actualizar con:
mycollection.update({'_id':mongo_id}, {"$set": post}, upsert=False)
El parámetro Upsert se insertará en lugar de actualizar si la publicación no se encuentra en la base de datos.
La documentación está disponible en el sitio de mongodb .

ACTUALIZACIÓN Para la versión> 3 use update_one en lugar de actualizar :

mycollection.update_one({'_id':mongo_id}, {"$set": post}, upsert=False)

collection.save(the_changed_dict) esta manera. Acabo de probar esto, y todavía funciona para mí. Lo siguiente se cita directamente de pymongo doc. :

save(to_save[, manipulate=True[, safe=False[, **kwargs]]])

Guardar un documento en esta colección.

Si to_save ya tiene un “_id”, se realiza una operación de actualización () (sobrescribir) y se sobrescribe cualquier documento existente con ese “_id”. De lo contrario, se realiza una operación de inserción (). En este caso, si manipular es verdadero, se agregará un “_id” a to_save y este método devuelve el “_id” del documento guardado. Si manipular es Falso, el servidor agregará “_id”, pero este método devolverá Ninguno.

 mycollection.find_one_and_update({"_id": mongo_id}, {"$set": {"newfield": "abc"}}) 

Debería funcionar espléndidamente para ti. Si no hay ningún documento de id mongo_id , fallará, a menos que también use upsert=True . Esto devuelve el documento antiguo por defecto. Para obtener el nuevo, pase return_document=ReturnDocument.AFTER . Todos los parámetros se describen en la API .

El método fue introducido para MongoDB 3.0. Se amplió a 3.2, 3.4 y 3.6.

Esta es una pregunta antigua, pero me topé con esto cuando buscaba la respuesta, así que quería dar la actualización a la respuesta para referencia.

Los métodos de save y update están en desuso.

save (to_save, manipulate = True, check_keys = True, ** kwargs) ¶ Guarde un documento en esta colección.

DEPRECATED – Use en su lugar insert_one () o replace_one ().

Cambiado en la versión 3.0: Se eliminó el parámetro seguro. Pase w = 0 para operaciones de escritura no reconocidas.

update (spec, document, upsert = False, manipulate = False, multi = False, check_keys = True, ** kwargs) Actualice un documento (s) en esta colección.

DEPRECATED: en su lugar, se utiliza replace_one (), update_one () o update_many ().

Cambiado en la versión 3.0: Se eliminó el parámetro seguro. Pase w = 0 para operaciones de escritura no reconocidas.

En el caso particular de los OP, es mejor usar replace_one .

De acuerdo con la documentación más reciente sobre PyMongo titulada Insertar un documento (la inserción está en desuso) y el siguiente enfoque defensivo, debe insertar y actualizar de la siguiente manera:

 result = mycollection.insert_one(post) post = mycollection.find_one({'_id': result.inserted_id}) if post is not None: post['newfield'] = "abc" mycollection.save(post)