Docs Menu
Docs Home
/ /

$pull (operador de actualización)

$pull

El $pull El operador elimina de una matriz existente todas las instancias de un valor o valores que coincidan con una condición especificada.

Puedes usar $pull para implementaciones alojadas en los siguientes entornos:

  • MongoDB Atlas: El servicio totalmente gestionado para implementaciones de MongoDB en la nube

  • MongoDB Enterprise: La versión basada en suscripción y autogestionada de MongoDB

  • MongoDB Community: La versión de MongoDB con código fuente disponible, de uso gratuito y autogestionada.

El operador $pull tiene la siguiente forma:

{ $pull: { <field1>: <value|condition>, <field2>: <value|condition>, ... } }

Para especificar un <field> en un documento incrustado o en un arreglo, utiliza notación de puntos.

A partir de MongoDB 5.0, los operadores de actualización procesan los campos de documentos con nombres basados en cadenas en orden lexicográfico. Los campos con nombres numéricos se procesan en orden numérico. Consulta Comportamiento del operador de actualización para obtener más información.

Si especificas un <condition> y los elementos del arreglo son documentos incrustados, el operador $pull aplica el <condition> como si cada elemento del arreglo fuera un documento de una colección. Consulta Remover todos los elementos que coincidan con una condición $pull especificada con bulkWrite() para ver un ejemplo.

Si el <value> especificado para remover es un arreglo, $pull remueve solo los elementos del arreglo que coincidan exactamente con el <value> especificado, incluido el orden.

Si el <value> especificado para remover es un documento, $pull remueve solo los elementos del arreglo que tengan exactamente los mismos campos y valores. El orden de los campos puede diferir.

A partir de MongoDB 5.0, mongod ya no genera un error cuando utiliza un operador de actualización como $pull con una expresión de operando vacía ( { } ). Una actualización vacía no produce cambios y no genera ninguna entrada en el oplog (lo que significa que la operación es una “no-op").

Crear la colección stores:

db.stores.insertMany( [
{
_id: 1,
fruits: [ "apples", "pears", "oranges", "grapes", "bananas" ],
vegetables: [ "carrots", "celery", "squash", "carrots" ]
},
{
_id: 2,
fruits: [ "plums", "kiwis", "oranges", "bananas", "apples" ],
vegetables: [ "broccoli", "zucchini", "carrots", "onions" ]
}
] )

La siguiente operación elimina

  • "apples" y "oranges" del arreglo fruits

  • "carrots" del arreglo vegetables

db.stores.updateMany(
{ },
{ $pull: { fruits: { $in: [ "apples", "oranges" ] }, vegetables: "carrots" } }
)

Confirma el resultado con db.collection.find():

{
_id: 1,
fruits: [ 'pears', 'grapes', 'bananas' ],
vegetables: [ 'celery', 'squash' ]
},
{
_id: 2,
fruits: [ 'plums', 'kiwis', 'bananas' ],
vegetables: [ 'broccoli', 'zucchini', 'onions' ]
}

Crear la colección profiles:

db.profiles.insertOne( { _id: 1, votes: [ 3, 5, 6, 7, 7, 8 ] } )

La siguiente operación removerá todos los elementos del arreglo votes que sean mayores o iguales a ( $gte ) 6:

db.profiles.updateOne( { _id: 1 }, { $pull: { votes: { $gte: 6 } } } )

Después de la operación de actualización, el documento solo tiene valores menores que 6:

{ _id: 1, votes: [ 3, 5 ] }

La siguiente operación de db.collection.bulkWrite():

  • Crea la colección profilesBulkWrite.

  • Remueve todos los elementos del arreglo votes que son mayores o iguales a ( $gte ) 6.

  • Remueve todos los elementos del arreglo votes que sean menores o iguales a ( $lte ) 3.

try {
db.profilesBulkWrite.bulkWrite( [
{
insertOne: {
"document": { _id: 1, votes: [ 3, 5, 6, 7, 7, 8 ] }
}
},
{
updateOne: {
"filter": { _id: 1 },
"update": { $pull: { votes: { $gte: 6 } } }
}
},
{
updateOne: {
"filter": {_id: 1},
"update": { $pull: { votes: { $lte: 3 } } }
}
}
] );
} catch (e) {
print(e);
}

Nota

bulkWrite()

El método db.collection.bulkWrite() ejecuta múltiples operaciones de escritura listadas en un arreglo. En este ejemplo, el db.collection.bulkWrite() realiza múltiples operaciones en la colección profiles.

Después de la operación db.collection.bulkWrite(), puedes confirmar que el documento solo tiene valores menores que 6 y mayores que 3 utilizando la siguiente operación:

db.profilesBulkWrite.find()

La operación devuelve lo siguiente:

[ { _id: 1, votes: [ 5 ] } ]

Crear la colección survey:

db.survey.insertMany([
{
_id: 1,
results: [
{ item: "A", score: 5 },
{ item: "B", score: 8 }
]
},
{
_id: 2,
results: [
{ item: "C", score: 8 },
{ item: "B", score: 4 }
]
}
] )

La siguiente operación remueve todos los elementos del arreglo results que contienen tanto un campo score igual a 8 como un campo item igual a "B":

db.survey.updateMany(
{ },
{ $pull: { results: { score: 8 , item: "B" } } }
)

La expresión $pull aplica la condición a cada elemento del arreglo results como si fuera un documento de nivel superior.

Después de la operación, el arreglo results no contiene documentos que tengan tanto un campo score igual a 8 como un campo item igual a "B".

{ _id: 1, results: [ { item: 'A', score: 5 } ] },
{
_id: 2,
results: [ { item: 'C', score: 8 }, { item: 'B', score: 4 } ]
}

El operador $pull trata cada elemento como un objeto de nivel superior. La consulta se aplica a cada elemento. La expresión no necesita usar $elemMatch para especificar las condiciones de coincidencia.

Por el contrario, la siguiente operación no $pull ningún elemento de la colección original:

db.survey.updateMany(
{ },
{ $pull: { results: { $elemMatch: { score: 8 , item: "B" } } } }
)

Nota

Descarta la colección survey con:

Luego vuelve a crearlo para ejecutar este ejemplo.

Crea una nueva colección de survey con documentos que están incrustados en arreglos anidados.

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 } ]
}
]
}
] )

Luego puedes especificar múltiples condiciones en los elementos del arreglo answers con $elemMatch:

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

La operación actualizó el arreglo results en cada documento que coincidió. db.collection.updateMany() eliminó documentos de results cuando un elemento del arreglo incrustado answers coincidió con las condiciones de selección de la línea resaltada.

{
_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 } ]
}
]
}

Tip

Volver

$pop

En esta página