Nella versione MongoDB>=3.2
:
Puoi sfruttare .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);
Rif: scrittura in blocco
Nella versione MongoDB>=4.2
:
Poiché volevi eliminare più campi (in cui i nomi dei campi non possono essere elencati o sconosciuti) con null
valore, prova sotto la query:
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 }
);
Test : parco giochi mongo
Rif: update-with-an-aggregation-pipeline , aggregation-pipeline
Nota :
Credo che questa sarebbe un'operazione una tantum e in futuro potrai utilizzare Joi
pacchetto npm o validatori schema mongoose per limitare la scrittura di null
come valori di campo. Se puoi elencare i nomi dei tuoi campi come se non troppi e la dimensione del set di dati fosse troppo alta, prova a utilizzare l'aggregazione con $$REMOVE
come suggerito da '@thammada'.
A partire da ora, pipeline di aggregazione in .updateMany()
non è supportato da molti client anche poche versioni di mongo shell - allora il mio ticket per loro è stato risolto usando .update()
, se non funziona, prova a utilizzare update + { multi : true }
.