MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

$ unset trên nhiều trường trong mongodb

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 } .



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Làm thế nào để tìm các chỉ mục không được sử dụng trong MongoDB?

  2. Sắp xếp với một chỉ mục hoạt động như thế nào trong MongoDB?

  3. Khoảng cách in MongoDB giữa hai điểm

  4. Nhóm theo giá trị và điều kiện

  5. Cập nhật các mảng lồng nhau trong mongoDB qua mongo shell