Auf MongoDB-Version>=3.2
:
Sie können .bulkWrite()
nutzen :
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);
Referenz: Bulkwrite
Auf MongoDB-Version>=4.2
:
Da Sie mehrere Felder (wo Feldnamen nicht aufgelistet oder unbekannt sein können) mit null
löschen wollten Wert, versuchen Sie es mit der folgenden Abfrage:
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 : Mongospielplatz
Referenz: update-with-an-aggregation-pipeline , aggregation-pipeline
Hinweis:
Ich glaube, dies wäre ein einmaliger Vorgang und in Zukunft können Sie Joi
verwenden npm-Paket oder Mungo-Schema-Validierer, um das Schreiben von null
einzuschränken als Feldwerte. Wenn Sie Ihre Feldnamen auflisten können, als ob nicht zu viele plus Datensatzgröße viel zu hoch wären, dann versuchen Sie, die Aggregation mit $$REMOVE
zu verwenden wie von '@thammada' vorgeschlagen.
Ab sofort Aggregation-Pipeline in .updateMany()
wird von vielen Clients nicht unterstützt, nicht einmal von wenigen Mongo-Shell-Versionen - damals wurde mein Ticket zu ihnen mit .update()
gelöst , wenn es nicht funktioniert, versuchen Sie es mit update + { multi : true }
.