En MongoDB, puede usar $unset
operador de actualización de campo para eliminar completamente un campo de un documento.
El $unset
El operador está diseñado específicamente para eliminar un campo y su valor del documento.
Ejemplo
Supongamos que tenemos una colección llamada dogs
con los siguientes documentos:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 6, "name" : "Fetch", "type" : "Dog", "weight" : 17 } { "_id" : 7, "name" : "Jake", "type" : "Dog", "weight" : 30 }
Y supongamos que queremos eliminar el type
(y su respectivo valor) de todos los documentos.
Podemos hacer esto:
db.dogs.updateMany(
{ },
{ $unset: { type: "" } }
)
Salida:
{ "acknowledged" : true, "matchedCount" : 4, "modifiedCount" : 4 }
Esto nos dice que cuatro documentos coincidieron (porque usamos un documento de consulta vacío como primer argumento) y cuatro se actualizaron.
Ahora revisemos la colección nuevamente:
db.dogs.find()
Resultado:
{ "_id" : 1, "name" : "Wag", "weight" : 20 } { "_id" : 2, "name" : "Bark", "weight" : 10 } { "_id" : 6, "name" : "Fetch", "weight" : 17 } { "_id" : 7, "name" : "Jake", "weight" : 30 }
Podemos ver que el type
El campo se ha eliminado por completo de cada documento.
Tenga en cuenta que el valor especificado en el $unset
expresión (es decir, "") no afecta la operación.
Eliminar varios campos
Puede especificar varios campos para eliminar separándolos con una coma.
Ejemplo:
db.dogs.updateMany(
{ },
{ $unset: { name: "", weight: "" } }
)
Salida:
{ "acknowledged" : true, "matchedCount" : 4, "modifiedCount" : 4 }
Consulta la colección:
db.dogs.find()
Resultado:
{ "_id" : 1 } { "_id" : 2 } { "_id" : 6 } { "_id" : 7 }
Ahora solo el _id
quedan campos.
Documentos incrustados
Puede usar la notación de puntos para eliminar campos de documentos incrustados.
Supongamos que tenemos una colección llamada pets
con el siguiente documento:
{ "_id" : 1, "name" : "Wag", "details" : { "type" : "Dog", "weight" : 20, "awards" : { "Florida Dog Awards" : "Top Dog", "New York Marathon" : "Fastest Dog", "Sumo 2020" : "Biggest Dog" } } }
Y supongamos que queremos eliminar los awards
campo del documento.
Podemos hacer esto:
db.pets.updateMany(
{ _id: 1 },
{ $unset: { "details.awards": "" } }
)
Salida:
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
Ahora revisemos el documento:
db.pets.findOne()
Resultado:
{ "_id" : 1, "name" : "Wag", "details" : { "type" : "Dog", "weight" : 20 } }
Los awards
y su valor (que en sí mismo era un documento incrustado) se ha eliminado del documento.