2010-12-07 8 views
53

Digamos que inserté el documento.¿Cómo actualizo un documento de Mongo después de insertarlo?

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) 

Respuesta

79

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

ACTUALIZACIÓN Para la versión> 3 utilización update_one en lugar de actualización:

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

+2

actualización está en desuso. – Elliott

+1

@Elliott: ¿cuál es la otra alternativa? – irobo

+0

@AIR: vea [abajo] (https://stackoverflow.com/a/46608956/1587329) (muy abajo) –

20

voy a utilizar collection.save(the_changed_dict) de esta manera. Acabo de probar esto, y todavía funciona para mí. A continuación 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", entonces una actualización() (upsert) se lleva a cabo la operación y cualquier documento existente con que "_id" es sobrescribe. De lo contrario, se realiza una operación de inserción(). En este caso si manipular es verdadero, se agregará "_id" a to_save y este método devuelve el "_id" del documento guardado. Si manipular es False , el servidor agregará "_id" pero este método devolverá Ninguno.

6

Esta es una vieja pregunta, pero me encontré con esto al buscar la respuesta, así que quería dar la actualización a la respuesta para referencia. Los métodos save y update están en desuso.

Guardar (to_save, manipular = True, check_keys = True, ** kwargs) ¶ guardar un documento en esta colección.

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

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

update (spec, document, upsert = False, manipular = False, multi = False, check_keys = Verdadero, ** kwargs) Actualizar un documento (s) en esta colección.

DEPRECATED - Use replace_one(), update_one(), o update_many() en su lugar.

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

En el caso particular de OPs, es mejor usar replace_one.

5

De acuerdo con la documentación más reciente sobre PyMongo titulado Insert a Document (inserto está en desuso), siguiendo el planteamiento defensivo, usted debe insertar y actualización 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) 
5
mycollection.find_one_and_update({"_id": mongo_id}, 
           {"$set": {"newfield": "abc"}}) 

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

+1

Esta es la respuesta correcta para pymongo actual – Chris

+1

También funciona si sube "_id" para otro campo como "nombre de usuario" fyi – Chris

Cuestiones relacionadas