sql >> Database teknologi >  >> NoSQL >> MongoDB

$unset på flere felter i mongodb

På MongoDB version>=3.2 :

Du kan drage fordel af .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 : bulkwrite

På MongoDB version>=4.2 :

Da du ønskede at slette flere felter (hvor feltnavne ikke kan listes ned eller ukendte) med null værdi, prøv nedenstående forespørgsel :

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: mongolegeplads

Ref: update-with-an-aggregation-pipeline , aggregation-pipeline

Bemærk:

Jeg tror, ​​at dette ville være engangsoperation, og i fremtiden kan du bruge Joi npm-pakke eller mongoose-skemavalidatorer for at begrænse skrivning af null 's som feltværdier. Hvis du kan liste dine feltnavne ned, som om ikke for mange plus datasætstørrelsen er alt for høj, så prøv at bruge aggregering med $$REMOVE som foreslået af '@thammada'.

Fra nu af, aggregerings-pipeline i .updateMany() understøttes ikke af mange klienter, selv få mongo-shell-versioner - dengang blev min billet til dem løst ved at bruge .update() , hvis det ikke virker, så prøv at bruge update + { multi : true } .



  1. Forstå latency ved hjælp af Redis-Cli

  2. MongoDB $max Aggregation Pipeline Operator

  3. kunne ikke oprette forbindelse til server 127.0.0.1 shell/mongo.js

  4. Hvordan gemmer man resultater fra dynamisk genererede formularer i MongoDb?