Digamos que yo inserte el documento.

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

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

post = mycollection.find_one({"_id":mongo_id}) 
post['newfield'] = "abc"
mycollection.save(post)
InformationsquelleAutor TIMEX | 2010-12-07

5 Comentarios

  1. 100

    En pymongo puede actualizar con:

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

    Upsert parámetro se inserte en lugar de actualizar si el post no se encontró en la base de datos.

    La documentación está disponible en mongodb sitio.

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

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

    • ¿cuál es la otra alternativa?
  2. 26
    mycollection.find_one_and_update({"_id": mongo_id}, 
                                     {"$set": {"newfield": "abc"}})

    debería funcionar de maravilla para usted. Si no hay ningún documento de identificación mongo_id, se producirá un error, a menos que utilice upsert=True. Esto devuelve el antiguo documento por defecto. Para obtener uno nuevo, pasar return_document=ReturnDocument.AFTER. Todos los parámetros se describen en la API.

    El método fue introducido por MongoDB 3.0. Fue extendido para la 3.2, 3.4 y 3.6.

    • Esta es la respuesta correcta para la actual pymongo
    • También funciona si usted sub «_id» para otro campo como «nombre de usuario» fyi
    • Cuando usted dice «actual pymongo», aquellos de nosotros en el futuro no pueden tener la misma versión. Es bueno para ser específicos.
    • este es un excelente punto yo no hemos visto lo contrario. Va a hacer en futuros posts, thx.
    • La edición es de gran ayuda. Gracias! Y gracias de futuro-me cuando me olvido de esto y tener que buscarlo de nuevo!
  3. 22

    Voy a utilizar collection.save(the_changed_dict) de esta manera. He probado esto, y todavía funciona para mí. El siguiente es citado 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», a continuación,
    un update() (upsert) se realiza la operación y
    cualquier documento existente con que «_id» es
    sobrescribe. De lo contrario, un insert() se realiza la operación. En este
    caso de manipular es un Verdadero «_id» será añadido a to_save y este
    el método devuelve el «_id» del documento guardado. Si manipular es Falso
    el «_id» será añadido por el servidor, pero este método devolverá
    Ninguno.

  4. 9

    Esta es una vieja cuestión, pero me topé con esto, cuando se busca la respuesta así que quería darle 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=Cierto, **kwargs)¶ Guardar un
    documento en esta colección.

    OBSOLETO Uso insert_one() o replace_one() en su lugar.

    Cambiado en la versión 3.0: se Quitó el seguro parámetro. Pasar w=0 para
    sin confirmar que las operaciones de escritura.

    actualización(spec, documento, upsert=False, manipular=False, multi=False,
    check_keys=Cierto, **kwargs) Actualización de un documento(s) en esta colección.

    OBSOLETO Uso replace_one(), update_one(), o update_many()
    en su lugar.

    Cambiado en la versión 3.0: se Quitó el seguro parámetro. Pasar w=0 para
    sin confirmar que las operaciones de escritura.

    de la OPs caso en particular, es mejor usar replace_one.

  5. 9

    De acuerdo a la documentación más reciente sobre PyMongo titulado Insertar un Documento (inserte está en desuso) y el siguiente enfoque preventivo, 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)

Dejar respuesta

Please enter your comment!
Please enter your name here