es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo actualizar un documento de MongoDB con una condición de que contenga un campo de objeto en el array de objetos.

El objetivo es buscar el valor del campo del objeto en el array user.inCart; si se encuentra el valor, se actualiza el campo del objeto “quntity”. En caso contrario, se añade un nuevo objeto al array.

Tengo este código que funciona correctamente:

Users.findOneAndUpdate({
    id: req.user.id,
    'inCart.item': req.body.item
},
{
    $inc: {'inCart.$.quantity': req.body.quantity}
}).then(data=>{
    if (data != null) {
        res.status(200)
    } else{
        Users.findOneAndUpdate({
            id: req.user.id,
        },{
            $push : {inCart:{item: req.body.item, quantity: req.body.quantity} }
        }).then(()=> res.status(200))
    }
})

¿Hay alguna manera de hacer lo mismo con una única solicitud?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Sí, puedes lograr el mismo resultado con una sola solicitud utilizando la opción upsert en el método findOneAndUpdate. La opción upsert crea un nuevo documento si no hay documentos que coincidan con los criterios de filtrado. Así es como puedes modificar el código para usar la opción upsert:

    Users.findOneAndUpdate({
        id: req.user.id,
        'inCart.item': req.body.item
    }, {
        $inc: {'inCart.$.quantity': req.body.quantity},
        $set: {id: req.user.id}
    }, {
        upsert: true,
        new: true
    }).then(data => {
        res.status(200).send(data);
    }).catch(error => {
        res.status(500).send(error);
    });
    

    En este código, el operador $set se utiliza para establecer el campo id a req.user.id. Las opciones upsert y new se establecen como true en el parámetro de opciones. La opción upsert le indica a MongoDB que cree un nuevo documento si los criterios de filtrado no coinciden con ningún documento, mientras que la opción new devuelve el documento modificado en lugar del documento original.

    Si se encuentra el documento con el item coincidente, el operador $inc actualiza el campo quantity. Si no se encuentra el documento, se crea un nuevo documento con los campos item y quantity establecidos en los valores de req.body. El documento nuevo o actualizado se envía como respuesta. Si hay un error, se envía un código de estado 500 con el mensaje de error.

Comments are closed.