Във версия на MongoDB>=3.2
:
Можете да се възползвате от .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);
Реф.: насипно писане
На версия на MongoDB>=4.2
:
Тъй като искахте да изтриете множество полета (където имената на полета не могат да бъдат изброени надолу или неизвестни) с null
стойност, опитайте по-долу заявка :
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 }
);
Тест: mongoplayground
Реф.: update-with-an-aggregation-pipeline , aggregation-pipeline
Забележка:
Вярвам, че това ще бъде еднократна операция и в бъдеще можете да използвате Joi
npm пакет или валидатори на схема mongoose за ограничаване на писането на null
е като стойности на полета. Ако можете да изброите имената на полетата си, сякаш не е твърде много плюс размерът на набора от данни е твърде висок, опитайте да използвате агрегиране с $$REMOVE
както е предложено от '@thammada'.
Засега конвейерът за агрегиране в .updateMany()
не се поддържа от много клиенти дори няколко версии на mongo shell - тогава моят билет към тях беше разрешен с помощта на .update()
, ако не работи, опитайте да използвате update + { multi : true }
.