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)