MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

$unset за множество полета в mongodb

Във версия на 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 } .



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Google Cloud Platform – Не мога да се свържа с mongodb

  2. Как да украсите експортираните MongoDB документи в mongoexport

  3. Mongodb, обобщена заявка с $lookup

  4. Премахнете поддокумент, вложен в масив в MongoDB

  5. Как да използвате $push модификатор за актуализиране в MongoDB и C#, когато актуализирате масив в документ