Trên phiên bản MongoDB> =3.2
:
Bạn có thể tận dụng .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);
Tham khảo: viết hàng loạt
Trên phiên bản MongoDB> =4.2
:
Vì bạn muốn xóa nhiều trường (trong đó tên trường không thể liệt kê xuống hoặc không xác định) có null
giá trị, hãy thử truy vấn bên dưới:
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 }
);
Kiểm tra: mongoplayground
Tham khảo: cập nhật-với-an-tổng hợp-đường ống, tổng hợp-đường ống dẫn
Lưu ý:
Tôi tin rằng đây sẽ là hoạt động một lần và trong tương lai bạn có thể sử dụng Joi
gói npm hoặc trình xác thực giản đồ mongoose để hạn chế ghi null
là các giá trị trường. Nếu bạn có thể liệt kê các tên trường của mình như thể không quá nhiều cộng với kích thước tập dữ liệu quá cao thì hãy thử sử dụng tính năng tổng hợp với $$REMOVE
theo đề xuất của '@thammada'.
Hiện tại, tổng hợp-đường ống trong .updateMany()
không được hỗ trợ bởi nhiều khách hàng, thậm chí một số phiên bản shell mongo - hồi đó tôi đã giải quyết được vấn đề của chúng tôi bằng cách sử dụng .update()
, nếu nó không hoạt động thì hãy thử sử dụng update + { multi : true }
.