Op MongoDB-versie>=3.2
:
U kunt profiteren van .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: bulkschrijven
Op MongoDB-versie>=4.2
:
Omdat u meerdere velden wilde verwijderen (waar veldnamen niet kunnen worden weergegeven of onbekend zijn) met null
waarde, probeer onderstaande vraag:
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 : mongospeeltuin
Ref: update-met-een-aggregatie-pijplijn , aggregatie-pijplijn
Opmerking:
Ik geloof dat dit een eenmalige operatie zou zijn en in de toekomst kun je Joi
. gebruiken npm-pakket of mongoose-schemavalidators om het schrijven van null
te beperken 's als veldwaarden. Als u uw veldnamen kunt opsommen alsof niet te veel plus datasetgrootte veel te hoog is, probeer dan aggregatie te gebruiken met $$REMOVE
zoals voorgesteld door '@thammada'.
Vanaf nu aggregatie-pijplijn in .updateMany()
wordt niet door veel klanten ondersteund, zelfs door weinig mongo shell-versies - toen werd mijn ticket aan hen opgelost door .update()
te gebruiken , als het niet werkt, probeer dan update + { multi : true }
. te gebruiken .