MongoDB Eliminar elemento de un array
- MongoDB Eliminar elemento de un array
-
Use MongoDB
$pull
para eliminar elementos de un array de documentos -
Use MongoDB
$pullAll
para eliminar elementos de un array -
Use MongoDB
$pop
para eliminar elementos de un array -
Use MongoDB
$unset
para eliminar un campo que contiene el elemento dado -
Use el operador posicional de MongoDB para establecer el elemento en
null
en lugar de eliminarlo
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 elvalor
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á lacondició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.
Artículo relacionado - MongoDB Array
- Encuentre un documento específico con matriz en MongoDB
- MongoDB Agregar elemento a la matriz
- Use forEach() para actualizar un campo de matriz en MongoDB Shell