Ve verzi MongoDB>=3.2
:
Můžete využít .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);
Odkaz: hromadný zápis
Ve verzi MongoDB>=4.2
:
Protože jste chtěli smazat více polí (kde názvy polí nemohou být uvedeny níže nebo jsou neznámé) s null
hodnotu, zkuste dotaz níže:
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: mongohřiště
Odkaz: update-with-an-agregation-pipeline , aggregation-pipeline
Poznámka:
Věřím, že by to byla jednorázová operace a v budoucnu můžete použít Joi
Balíček npm nebo validátory schématu mongoose k omezení zápisu null
's jako hodnoty pole. Pokud můžete uvést názvy polí, jako by jich nebylo příliš mnoho a velikost datové sady byla příliš velká, zkuste použít agregaci pomocí $$REMOVE
jak navrhuje '@thammada'.
Od této chvíle, agregační potrubí v .updateMany()
není podporováno mnoha klienty, dokonce i několika verzemi mongo shellu - tenkrát se můj lístek k nim vyřešil pomocí .update()
, pokud to nefunguje, zkuste použít update + { multi : true }
.