På MongoDB version>=3.2
:
Du kan dra nytta av .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
:
Eftersom du ville ta bort flera fält (där fältnamn inte kan listas ner eller okända) med null
värde, försök nedanstående fråga :
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 : mongoplayground
Ref : update-with-an-aggregation-pipeline , aggregation-pipeline
Obs:
Jag tror att detta skulle vara engångsoperation och i framtiden kan du använda Joi
npm-paket eller mongoose-schemavalidatorer för att begränsa skrivning av null
's som fältvärden. Om du kan lista ner dina fältnamn som om inte för många plus datauppsättningsstorleken är alldeles för hög, försök då att använda aggregering med $$REMOVE
som föreslagits av '@thammada'.
Från och med nu, aggregeringspipeline i .updateMany()
stöds inte av många klienter även av få mongo-skalversioner - då löstes min biljett till dem genom att använda .update()
, om det inte fungerar, försök att använda update + { multi : true }
.