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)
¿Fue útil?

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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top