W wersji MongoDB>=3.2
:
Możesz skorzystać z .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);
Odniesienie: pisanie zbiorcze
W wersji MongoDB>=4.2
:
Ponieważ chciałeś usunąć wiele pól (gdzie nazwy pól nie mogą być wymienione w dół lub nieznane) o wartości null
wartość, spróbuj poniżej zapytania :
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: plac zabaw dla mongo
Odniesienie: aktualizacja-z-potoku-agregacji , potok-aggregacji
Uwaga:
Wierzę, że byłaby to jednorazowa operacja i w przyszłości możesz użyć Joi
pakiet npm lub walidatory schematu mongoose, aby ograniczyć pisanie null
są wartościami pól. Jeśli możesz wypisać nazwy pól tak, jakby nie było ich zbyt wiele, a rozmiar zestawu danych jest zbyt duży, spróbuj użyć agregacji z $$REMOVE
zgodnie z sugestią „@thammada”.
Od teraz potok agregacji w .updateMany()
nie jest obsługiwany przez wielu klientów nawet kilka wersji powłoki mongo - wtedy mój bilet do nich został rozwiązany za pomocą .update()
, jeśli to nie zadziała, spróbuj użyć update + { multi : true }
.