Na versão MongoDB>=
3.2
: Você pode aproveitar
.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);
Referência: gravação em massa
Na versão MongoDB>=
4.2
: Como você deseja excluir vários campos (onde os nomes dos campos não podem ser listados ou desconhecidos) com
null
valor, tente abaixo da 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 }
);
Teste: mongoplayground
Referência: update-with-an-aggregation-pipeline , aggregation-pipeline
Observação:
Eu acredito que esta seria uma operação única e no futuro você pode usar
Joi
pacote npm ou validadores de esquema mangusto para restringir a escrita de null
's como valores de campo. Se você puder listar os nomes dos seus campos como se não muitos mais o tamanho do conjunto de dados fosse muito alto, tente usar a agregação com $$REMOVE
como sugerido por '@thammada'. A partir de agora, o pipeline de agregação em
.updateMany()
não é suportado por muitos clientes, mesmo por algumas versões do shell mongo - naquela época, meu ticket para eles foi resolvido usando .update()
, se não funcionar, tente usar update + { multi : true }
.