En la versión de MongoDB>=3.2
:
Puede aprovechar .bulkWrite()
:
let bulkArr = [
{
updateMany: {
filter: { name: null },
update: { $unset: { name: 1 } }
}
},
{
updateMany: {
filter: { Roll_no: null },
update: { $unset: { Roll_no: 1 } }
}
},
{
updateMany: {
filter: { hobby: null },
update: { $unset: { hobby: 1 } }
}
},
];
/** All filter conditions will be executed on all docs
* but respective update operation will only be executed if respective filter matches (kind of individual ops) */
db.collection.bulkWrite(bulkArr);
Referencia: escritura masiva
En la versión de MongoDB>=4.2
:
Dado que quería eliminar varios campos (donde los nombres de los campos no se pueden enumerar o desconocer) que tienen null
valor, intente debajo de la consulta:
db.collection.update(
{}, // Try to use a filter if possible
[
/**
* using project as first stage in aggregation-pipeline
* Iterate on keys/fields of document & remove fields where their value is 'null'
*/
{
$project: {
doc: {
$arrayToObject: { $filter: { input: { $objectToArray: "$$ROOT" }, cond: { $ne: ["$$this.v", null] } } }
}
}
},
/** Replace 'doc' object as root of document */
{
$replaceRoot: { newRoot: "$doc" }
}
],
{ multi: true }
);
Referencia: actualizar-con-una-canalización-de-agregación , canalización-de-agregación
Nota:
Creo que esta sería una operación única y en el futuro puedes usar Joi
Paquete npm o validadores de esquema mongoose para restringir la escritura null
's como valores de campo. Si puede enumerar los nombres de sus campos como si no fueran demasiados más el tamaño del conjunto de datos es demasiado alto, intente usar la agregación con $$REMOVE
como lo sugiere '@thammada'.
A partir de ahora, tubería de agregación en .updateMany()
muchos clientes no lo admiten, incluso algunas versiones de mongo shell; en ese entonces, mi ticket para ellos se resolvió usando .update()
, si no funciona, intente usar update + { multi : true }
.