Pada versi MongoDB>=3.2
:
Anda dapat memanfaatkan .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 : tulis massal
Pada versi MongoDB>=4.2
:
Karena Anda ingin menghapus beberapa bidang (di mana nama bidang tidak dapat dicantumkan atau tidak diketahui) memiliki null
nilai, coba kueri di bawah ini:
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 }
);
Uji : taman bermain mongo
Ref : update-with-an-aggregation-pipeline , aggregation-pipeline
Catatan :
Saya percaya ini akan menjadi operasi satu kali &di masa depan Anda dapat menggunakan Joi
paket npm atau validator skema luwak untuk membatasi penulisan null
sebagai nilai bidang. Jika Anda dapat mencantumkan nama bidang Anda seolah-olah tidak terlalu banyak plus ukuran kumpulan data terlalu tinggi, coba gunakan agregasi dengan $$REMOVE
seperti yang disarankan oleh '@thammada'.
Sampai sekarang, agregasi-pipeline di .updateMany()
tidak didukung oleh banyak klien bahkan beberapa versi mongo shell - saat itu tiket saya ke mereka diselesaikan dengan menggunakan .update()
, jika tidak berhasil coba gunakan update + { multi : true }
.