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 eliminar un objeto anidado en una colección de mongodb

La colección que tengo se ve así:

[{
    "day": 10,
    "orders": [{
        "id": 1,
        "items": {
            "uuid1": {
                "name": "item1",
                "status": false
            },
            "uuid2": {
                "name": "item2",
                "status": true
            },
            "uuid3": {
                "name": "item2",
                "status": false
            }
        }
    }]
},
{
    "day": 11,
    "orders": [{
        "id": 1,
        "items": {
            "uuid1": {
                "name": "item1",
                "status": false
            },
            "uuid2": {
                "name": "item2",
                "status": true
            },
            "uuid3": {
                "name": "item2",
                "status": false
            }
        }
    }]
}]

Me gustaría eliminar los elementos con estado marcado como verdadero para el día 10. Intenté el siguiente código:

db.<collection>.update(
    {day: 10},
    {$pull: {
        orders: {items: {status: 'true'}}
    }},
    {multi: true}
);

El resultado es:

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })

por lo tanto, no se eliminan los elementos.

¿Cómo deberíamos reescribir esta consulta de actualización y eliminación para que se eliminen los elementos del día 10 marcados con estado verdadero?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para eliminar los elementos del día 10 con estado marcado como verdadero, la consulta necesita especificar el campo id en la matriz orders junto con items para actualizar el subdocumento. La consulta se puede reescribir de la siguiente manera:

    db.<colección>.update(
      {day: 10, "orders.id": 1},
      { $pull: { "orders.$.items": { status: true } } },
      {multi: true}
    );
    

    Esta consulta actualizará el subdocumento en la matriz orders con id igual a 1 en el documento con day igual a 10. El operador $ se usa para identificar el elemento coincidente en la matriz orders, y luego se actualiza el campo items usando $pull para eliminar subdocumentos con status igual a verdadero. La opción multi se establece en verdadero en caso de que se devuelvan varios documentos con day igual a 10.</colección>

Comments are closed.