sql >> Databasteknik >  >> NoSQL >> MongoDB

$unset på flera fält i mongodb

På MongoDB version>=3.2 :

Du kan dra nytta av .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 :

Eftersom du ville ta bort flera fält (där fältnamn inte kan listas ner eller okända) med null värde, försök nedanstående fråga :

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

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

Obs:

Jag tror att detta skulle vara engångsoperation och i framtiden kan du använda Joi npm-paket eller mongoose-schemavalidatorer för att begränsa skrivning av null 's som fältvärden. Om du kan lista ner dina fältnamn som om inte för många plus datauppsättningsstorleken är alldeles för hög, försök då att använda aggregering med $$REMOVE som föreslagits av '@thammada'.

Från och med nu, aggregeringspipeline i .updateMany() stöds inte av många klienter även av få mongo-skalversioner - då löstes min biljett till dem genom att använda .update() , om det inte fungerar, försök att använda update + { multi : true } .



  1. Returnera det sista sanna värdet för varje grupp

  2. Slaget om NoSQL-databaserna - Jämför MongoDB och CouchDB

  3. MongoDB jokertecken i nyckeln till en fråga

  4. Skapa, läs, uppdatera, radera data genom att använda Node.js - Mongoose