På MongoDB version>=3.2
:
Du kan drage fordel af .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);
Ref : bulkwrite
På MongoDB version>=4.2
:
Da du ønskede at slette flere felter (hvor feltnavne ikke kan listes ned eller ukendte) med null
værdi, prøv nedenstående forespørgsel :
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: mongolegeplads
Ref: update-with-an-aggregation-pipeline , aggregation-pipeline
Bemærk:
Jeg tror, at dette ville være engangsoperation, og i fremtiden kan du bruge Joi
npm-pakke eller mongoose-skemavalidatorer for at begrænse skrivning af null
's som feltværdier. Hvis du kan liste dine feltnavne ned, som om ikke for mange plus datasætstørrelsen er alt for høj, så prøv at bruge aggregering med $$REMOVE
som foreslået af '@thammada'.
Fra nu af, aggregerings-pipeline i .updateMany()
understøttes ikke af mange klienter, selv få mongo-shell-versioner - dengang blev min billet til dem løst ved at bruge .update()
, hvis det ikke virker, så prøv at bruge update + { multi : true }
.