Use MongoDB $Pull para eliminar documentos dentro de un array

Shihab Sikder 30 enero 2023
  1. Operador MongoDB $pull
  2. Comando MongoDB $pull con condición
  3. Usar $pull en el Array anidado
Use MongoDB $Pull para eliminar documentos dentro de un array

El operador $pull puede obtener cualquier elemento existente del array. Puede extraer uno o más elementos del array.

Puede eliminar cualquier objeto específico del array anidada.

Operador MongoDB $pull

$pull se usa en MongoDB para eliminar elementos existentes del array. El $pull se usa con la consulta update.

Aquí hay un ejemplo. Insertamos lo siguiente.

db.cart.insertMany( [
   {
      _id: 1,
      grocery:["biscuits", "oil", "honey", "milk", "paper"],
      electronics:["earphone", "bluetooth", "mouse", "keyboard"]
   },
   {
      _id: 2,
      grocery:["biscuits", "oil", "soda", "water", "paper"],
      electronics:["pendrive", "motherboard", "mouse", "SSD"]
   }
] )

Aquí hay dos carritos de compras. Digamos que la tienda no tiene stock de paper, SSD o mouse.

Entonces, desea eliminar estos productos del carrito de compras. Luego puede usar la siguiente consulta usando el operador $pull.

db.cart.updateMany({},
    {
        $pull:{ grocery: "paper",  electronics:{ $in:[ "SSD","mouse" ] } }
    }
)

El operador $in toma un array para hacer coincidir cada elemento con el documento. Después de esta operación, la colección será como la siguiente.

{
      _id: 1,
      grocery:["biscuits", "oil", "honey", "milk"],
      electronics:["earphone", "bluetooth", "keyboard"]
   },
   {
      _id: 2,
      grocery:["biscuits", "oil", "soda", "water"],
      electronics:["pendrive", "motherboard"]
   }

Comando MongoDB $pull con condición

Supongamos que tenemos el siguiente documento.

{
    _id: 1,
    price: [ 31, 50, 55, 66, 98, 25 ]
},
{
    _id: 2,
    price: [ 51, 55, 65, 91, 19, 26 ]
},

Ahora, desea eliminar los elementos del array price con un valor superior a 50. Entonces el comando será como el siguiente.

db.products.updateMany(
    {},
    { $pull: { price:{ $gte : 50} } }
)

Verá que usamos {} como el primer parámetro de updateMany. Esto se debe a que queremos actualizar todos los elementos.

Digamos que desea actualizar solo algunos _id específicos, entonces el comando será como el siguiente.

db.products.updateMany(
    {_id: 1},
    { $pull: { price:{ $gte : 50} } }
)

También puede usar el operador $in en el _id para seleccionar múltiples _id para actualizar y usar la operación pull.

Usar $pull en el Array anidado

Supongamos que tiene la siguiente colección de documentos.

db.survey.drop()

db.survey.insertMany( [
   {
      _id: 1,
      results: [
         {
            item: "A",
            score: 5,
            answers: [ { q: 1, a: 4 }, { q: 2, a: 6 } ]
         },
         {
            item: "B",
            score: 8,
            answers: [ { q: 1, a: 8 }, { q: 2, a: 9 } ]
         }
      ]
   },
   {
      _id: 2,
      results: [
         {
            item: "C",
            score: 8,
            answers: [ { q: 1, a: 8 }, { q: 2, a: 7 } ]
         },
         {
            item: "B",
            score: 4,
            answers: [ { q: 1, a: 0 }, { q: 2, a: 8 } ]
         }
      ]
   }
] )

Queremos eliminar aquellos elementos del array results en los que q es igual a 2, y a es mayor que igual a 8. Entonces la consulta será:

db.survey.updateMany(
  { },
  {
     $pull:
        {
           results:
              {
                 answers: { $elemMatch: { q: 2, a: { $gte: 8 } } }
              }
        }
  }
)

Después de esta operación, la colección actualizada se verá así:

{
  _id: 1,
  results: [
    {
      item: 'A',
      score: 5,
      answers: [ { q: 1, a: 4 }, { q: 2, a: 6 } ]
    }
  ]
},
{
  _id: 2,
  results: [
    {
      item: 'C',
      score: 8,
      answers: [ { q: 1, a: 8 }, { q: 2, a: 7 } ]
    }
  ]
}

Este ejemplo de array anidada se tomó de la documentación oficial de MongoDB. Aquí puedes leer la documentación completa y saber más sobre el operador $pull.

Shihab Sikder avatar Shihab Sikder avatar

I'm Shihab Sikder, a professional Backend Developer with experience in problem-solving and content writing. Building secure, scalable, and reliable backend architecture is my motive. I'm working with two companies as a part-time backend engineer.

LinkedIn Website