MongoDB Eliminar elemento de un array

Mehvish Ashiq 12 julio 2022
  1. MongoDB Eliminar elemento de un array
  2. Use MongoDB $pull para eliminar elementos de un array de documentos
  3. Use MongoDB $pullAll para eliminar elementos de un array
  4. Use MongoDB $pop para eliminar elementos de un array
  5. Use MongoDB $unset para eliminar un campo que contiene el elemento dado
  6. Use el operador posicional de MongoDB para establecer el elemento en null en lugar de eliminarlo
MongoDB Eliminar elemento de un array

Podemos adoptar diferentes enfoques dependiendo de los requisitos del proyecto. Hoy aprenderemos a utilizar $pull, $pullAll, $pop, $unset y el operador posicional ($) para eliminar un elemento de un array o array de documentos mientras se trabaja en MongoDB.

MongoDB Eliminar elemento de un array

Debemos tener una colección de documentos de muestra para practicar todas las formas mencionadas. Crearemos una colección llamada collection e insertaremos un solo documento.

También puede utilizar la siguiente collection que contiene un documento.

Código de ejemplo:

// MongoDB version 5.0.8

> db.collection.insertMany([
    {
        contact: {
            phone: [
                {"type" : "UAN", "number" : "123456789"},
                {"type" : "office", "number" : "987546321"},
                {"type" : "personal", "number" : "852147963"}
            ]
        },
        services: ["Google", "Instagram", "Twitter", "Facebook"],
        scores: [ 0, 1, 8, 17, 18, 8, 20, 10 ]
    },
    {
        contact: {
            phone: [
                {"type" : "UAN", "number" : "456321879"},
                {"type" : "office", "number" : "874596321"},
                {"type" : "personal", "number" : "964785123"}
            ]
        },
        services: ["Google", "Instagram", "Twitter"],
        scores: [ 1, 8, 2, 3, 8, 7, 1 ]

    }
]);

Si no tienes la colección llamada collection, no te preocupes; la consulta anterior creará eso para usted y lo completará. A continuación, puede ejecutar db.collection.find().pretty() para echar un vistazo al documento insertado.

Recuerde, no verá los documentos actualizados después de ejecutar los próximos ejemplos de código. Para eso, tienes que ejecutar el comando db.collection.find().pretty().

Use MongoDB $pull para eliminar elementos de un array de documentos

Código de ejemplo:

// MongoDB version 5.0.8

> db.collection.update(
    { _id : ObjectId("62aae796f27219958a489b89") },
    { $pull : { "contact.phone": { "number": "987546321" } } }
);

Producción :

{
    "_id" : ObjectId("62aae796f27219958a489b89"),
    "contact" : {
        "phone" : [
            { "type" : "UAN", "number" : "123456789" },
            { "type" : "personal", "number" : "852147963" }
         ]
     },
     "services" : [ "Google", "Instagram", "Twitter", "Facebook" ],
     "scores" : [ 0, 1, 8, 17, 18, 8, 20, 10 ]
}
{
    "_id" : ObjectId("62aae796f27219958a489b8a"),
    "contact" : {
        "phone" : [
            { "type" : "UAN", "number" : "456321879" },
            { "type" : "office", "number" : "874596321" },
            { "type" : "personal", "number" : "964785123" }
        ]
     },
     "services" : [ "Google", "Instagram", "Twitter" ],
     "scores" : [ 1, 8, 2, 3, 8, 7, 1 ]
}

Aquí, estamos utilizando el operador $pull para eliminar todas las instancias de un valor/valores de un array existente que coincida con la consulta de filtro o la condición especificada.

En el ejemplo de código anterior, buscamos un documento donde _id sea igual a ObjectId("62aae796f27219958a489b89"). Una vez que el documento coincide con la condición especificada, eliminamos la instancia de un array existente en la que contact.phone.number es igual a 987546321.

Recuerde los siguientes puntos cuando utilice el operador $pull.

  • Si el valor dado que debe eliminarse es un array, entonces el operador $pull elimina elementos solo de un array que satisface exactamente el valor dado (incluido el orden).
  • Si el valor dado que debe eliminarse es un documento, entonces el operador $pull elimina elementos solo de un array que contiene los campos y valores exactos. El orden de los campos puede diferir aquí.
  • Si la condición dada y los elementos del array son documentos incrustados, entonces el operador $pull aplicará la condición como si cada elemento del array fuera un documento en una colección. Para obtener más detalles al respecto, puede consultar esto.

Ahora, tenemos otra situación en la que queremos realizar la operación eliminar en todos los documentos de una colección. Para hacer eso, usamos la siguiente sintaxis usando $pull mientras que {multi: true} opera en todos los documentos de la condición especificada.

Código de ejemplo:

// MongoDB version 5.0.8

> db.collection.update({},
  { $pull: { "contact.phone": { "type": "UAN" } } },
  { multi: true }
);

Producción :

{
    "_id" : ObjectId("62aae796f27219958a489b89"),
    "contact" : {
        "phone" : [
            { "type" : "personal", "number" : "852147963" }
         ]
     },
     "services" : [ "Google", "Instagram", "Twitter", "Facebook" ],
     "scores" : [ 0, 1, 8, 17, 18, 8, 20, 10 ]
}
{
    "_id" : ObjectId("62aae796f27219958a489b8a"),
    "contact" : {
        "phone" : [
            { "type" : "office", "number" : "874596321" },
            { "type" : "personal", "number" : "964785123" }
        ]
     },
     "services" : [ "Google", "Instagram", "Twitter" ],
     "scores" : [ 1, 8, 2, 3, 8, 7, 1 ]
}

Para obtener el resultado anterior, eliminamos el elemento del array de todos los documentos en una colección donde contact.phone.type es igual a "UAN".

Nuestra siguiente tarea es eliminar elementos del array scores donde los valores son mayores o iguales a 2 y menores o iguales a 6 (2 <= valor <= 6). Ejecute la siguiente consulta para hacerlo para todos los documentos de la colección seleccionada.

Código de ejemplo:

// MongoDB version 5.0.8

> db.collection.update(
    {},
    { $pull : { scores : {$gte: 2, $lte: 6} } },
    { multi: true }
)

Producción :

{
    "_id" : ObjectId("62aae796f27219958a489b89"),
    "contact" : {
        "phone" : [
            { "type" : "personal", "number" : "852147963" }
         ]
     },
     "services" : [ "Google", "Instagram", "Twitter", "Facebook" ],
     "scores" : [ 0, 1, 8, 17, 18, 8, 20, 10 ]
}
{
    "_id" : ObjectId("62aae796f27219958a489b8a"),
    "contact" : {
        "phone" : [
            { "type" : "office", "number" : "874596321" },
            { "type" : "personal", "number" : "964785123" }
        ]
     },
     "services" : [ "Google", "Instagram", "Twitter" ],
     "scores" : [ 1, 8, 8, 7, 1 ]
}

Para practicar con valores de tipo cadena, podemos hacerlo de la siguiente manera.

Código de ejemplo:

// MongoDB version 5.0.8

> db.collection.update(
    {},
    { $pull: { "services": { $in: [ "Google", "Instagram" ] }, "scores": 1 } },
    { multi: true }
)

Producción :

{
    "_id" : ObjectId("62aae796f27219958a489b89"),
    "contact" : {
        "phone" : [
            { "type" : "personal", "number" : "852147963" }
         ]
     },
     "services" : [ "Twitter", "Facebook" ],
     "scores" : [ 0, 8, 17, 18, 8, 20, 10 ]
}
{
    "_id" : ObjectId("62aae796f27219958a489b8a"),
    "contact" : {
        "phone" : [
            { "type" : "office", "number" : "874596321" },
            { "type" : "personal", "number" : "964785123" }
        ]
     },
     "services" : [ "Twitter" ],
     "scores" : [ 8, 8, 7 ]
}

Para este ejemplo de código, usamos el operador de comparación $in para tener un array de valores y eliminarlos del array de services si alguno de ellos está presente.

Además, eliminamos 1 del array de scores si está allí mientras usamos el operador $pull para realizar toda esta operación de eliminación.

Use MongoDB $pullAll para eliminar elementos de un array

Código de ejemplo:

// MongoDB version 5.0.8

> db.collection.update(
    { _id: ObjectId("62aae796f27219958a489b8a") },
    { $pullAll: { "scores": [8] } }
)

Producción :

{
    "_id" : ObjectId("62aae796f27219958a489b89"),
    "contact" : {
        "phone" : [
            { "type" : "personal", "number" : "852147963" }
         ]
     },
     "services" : [ "Twitter", "Facebook" ],
     "scores" : [ 0, 8, 17, 18, 8, 20, 10 ]
}
{
    "_id" : ObjectId("62aae796f27219958a489b8a"),
    "contact" : {
        "phone" : [
            { "type" : "office", "number" : "874596321" },
            { "type" : "personal", "number" : "964785123" }
        ]
     },
     "services" : [ "Twitter" ],
     "scores" : [ 7 ]
}

Para este código, estamos usando el operador $pullAll para eliminar todas las ocurrencias (instancias) del valor dado de un array ya existente. Por ejemplo, si el número 8 aparece dos veces en la matriz puntuaciones, se eliminarán ambos valores 8.

Al igual que el operador $pull, que elimina los elementos del array especificando la consulta de filtro, $pullAll elimina/elimina los elementos del array que coinciden con los valores enumerados.

Usamos la notación de puntos para manejar documentos incrustados del array.

Use MongoDB $pop para eliminar elementos de un array

Podemos usar el operador $pop si estamos interesados ​​en eliminar el primer o el último elemento de un array. Para ello, le pasamos el -1 o 1 al operador $pop para quitar un elemento del array del primero o del último.

Código de ejemplo:

// MongoDB version 5.0.8

> db.collection.update(
  { _id: ObjectId("62aae796f27219958a489b89") },
  { $pop: { "scores": -1 } }
)

Producción :

{
    "_id" : ObjectId("62aae796f27219958a489b89"),
    "contact" : {
        "phone" : [
            { "type" : "personal", "number" : "852147963" }
         ]
     },
     "services" : [ "Twitter", "Facebook" ],
     "scores" : [ 8, 17, 18, 8, 20, 10 ]
}
{
    "_id" : ObjectId("62aae796f27219958a489b8a"),
    "contact" : {
        "phone" : [
            { "type" : "office", "number" : "874596321" },
            { "type" : "personal", "number" : "964785123" }
        ]
     },
     "services" : [ "Twitter" ],
     "scores" : [ 7 ]
}

Use MongoDB $unset para eliminar un campo que contiene el elemento dado

Código de ejemplo:

// MongoDB version 5.0.8

> db.collection.update(
    { _id : ObjectId("62aae796f27219958a489b89") },
    { $unset : {"scores" : 8 }}
)

Producción :

{
    "_id" : ObjectId("62aae796f27219958a489b89"),
    "contact" : {
        "phone" : [
            { "type" : "personal", "number" : "852147963" }
         ]
     },
     "services" : [ "Twitter", "Facebook" ]
}
{
    "_id" : ObjectId("62aae796f27219958a489b8a"),
    "contact" : {
        "phone" : [
            { "type" : "office", "number" : "874596321" },
            { "type" : "personal", "number" : "964785123" }
        ]
     },
     "services" : [ "Twitter" ],
     "scores" : [ 7 ]
}

Aquí, usamos el operador $unset para eliminar un campo específico que contiene el valor dado. Por ejemplo, estamos eliminando el campo scores que coincide con la consulta de filtro y contiene 8 como elemento del array.

Recuerde que cuando usamos el operador $unset con un operador posicional ($), no elimina el elemento coincidente sino que lo establece en null. Vea la siguiente sección para practicar eso.

Use el operador posicional de MongoDB para establecer el elemento en null en lugar de eliminarlo

Código de ejemplo:

// MongoDB version 5.0.8

> db.collection.update(
    {"services": "Facebook"},
    { $unset: {"services.$" : 1}}
)

Producción :

{
    "_id" : ObjectId("62aae796f27219958a489b89"),
    "contact" : {
        "phone" : [
            { "type" : "personal", "number" : "852147963" }
         ]
     },
     "services" : [ "Twitter", null ]
}
{
    "_id" : ObjectId("62aae796f27219958a489b8a"),
    "contact" : {
        "phone" : [
            { "type" : "office", "number" : "874596321" },
            { "type" : "personal", "number" : "964785123" }
        ]
     },
     "services" : [ "Twitter" ],
     "scores" : [ 7 ]
}

Este fragmento de código usa $unset con el operador posicional para establecer el elemento del array en null en lugar de eliminarlo. Usamos $ para actualizar el primer elemento del array donde el valor es Facebook en el array services.

Este enfoque se puede usar cuando no conocemos la posición de un elemento del array. Por otro lado, también podemos usar $[] (todos los operadores posicionales) si queremos actualizar todos los elementos en el campo del array dado.

Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook

Artículo relacionado - MongoDB Array

Artículo relacionado - MongoDB Document