¿Cómo se actualiza un documento Mongo después de insertarlo?
Pregunta
Digamos que insertar el documento.
post = { some dictionary }
mongo_id = mycollection.insert(post)
Ahora, digamos que quiero añadir 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)
Solución
En pymongo puede actualizar con:
mycollection.update({'_id':mongo_id}, {"$set": post}, upsert=False)
parámetro upsert insertará en lugar de la actualización si el artículo no se encuentra en la base de datos.
La documentación está disponible en mongodb sitio .
Actualizar Para la versión> 3 uso update_one en lugar de actualización
mycollection.update_one({'_id':mongo_id}, {"$set": post}, upsert=False)
Otros consejos
mycollection.find_one_and_update({"_id": mongo_id},
{"$set": {"newfield": "abc"}})
debería funcionar espléndidamente para usted. Si no hay ningún documento de identificación mongo_id
, se producirá un error, a menos que también utiliza upsert=True
. Esto devuelve el antiguo documento por defecto. Para obtener la nueva, pasar return_document=ReturnDocument.AFTER
. Todos los parámetros se describen en la API .
Se introdujo el método para MongoDB 3.0. Se extendió para 3.2, 3.4, y 3.6.
Me utilizará collection.save(the_changed_dict)
esta manera. Yo sólo he probado 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 se realiza una actualización () (upsert) operación y cualquier documento existente con que "_id" es sobrescribe. De lo contrario se realiza un inserto () operación. En esto manipular caso si es verdad Un "_ID" se añadirá a to_save y esto método devuelve el "_id" del documento guardado. Si es falso manipular la "_id" se añadirá por el servidor, pero este método devolverá Ninguno.
Esta es una vieja pregunta, pero se topó con esta en la búsqueda de la respuesta, así que quería dar a la actualización de la respuesta de referencia.
Los métodos save
y update
están en desuso.
Guardar (to_save, manipular = True, check_keys = true, ** kwargs) ¶ Guardar una documento en esta colección.
DEPRECATED -. Uso insert_one () o replace_one () en lugar
cambiado en la versión 3.0: se retira el parámetro de seguridad. Pase w = 0 para operaciones de escritura no reconocida.
actualización (especificaciones, documento, upsert = false, manipular = False, multi = False, check_keys = True, ** kwargs) Actualizar un documento (s) en esta colección.
DEPRECATED - Uso replace_one (), update_one (), o update_many () en su lugar.
cambiado en la versión 3.0: se retira el parámetro de seguridad. Pase w = 0 para operaciones de escritura no reconocida.
En el caso particular PO, es mejor usar replace_one
.
De acuerdo con la documentación más reciente sobre PyMongo titulado insertar un documento (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)