MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

$unset sur plusieurs champs dans mongodb

Sur la version MongoDB>=3.2 :

Vous pouvez profiter de .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);

Réf : écriture groupée

Sur la version MongoDB>=4.2 :

Puisque vous vouliez supprimer plusieurs champs (où les noms de champs ne peuvent pas être répertoriés ou inconnus) ayant null valeur, essayez la requête ci-dessous :

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 }
);

Tester : mongoplayground

Réf : mise à jour avec un pipeline d'agrégation , pipeline d'agrégation

Remarque :

Je crois que ce serait une opération unique et à l'avenir, vous pouvez utiliser Joi package npm ou validateurs de schéma mongoose pour restreindre l'écriture de null 's comme valeurs de champ. Si vous pouvez répertorier vos noms de champs comme s'il n'y en avait pas trop, plus la taille de l'ensemble de données est bien trop élevée, essayez d'utiliser l'agrégation avec $$REMOVE comme suggéré par '@thammada'.

A partir de maintenant, aggregation-pipeline dans .updateMany() n'est pas pris en charge par de nombreux clients, même quelques versions de mongo shell - à l'époque, mon ticket pour eux a été résolu en utilisant .update() , si cela ne fonctionne pas, essayez d'utiliser update + { multi : true } .