MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

$unset für mehrere Felder in Mongodb

Auf MongoDB-Version>=3.2 :

Sie können .bulkWrite() nutzen :

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

Referenz: Bulkwrite

Auf MongoDB-Version>=4.2 :

Da Sie mehrere Felder (wo Feldnamen nicht aufgelistet oder unbekannt sein können) mit null löschen wollten Wert, versuchen Sie es mit der folgenden Abfrage:

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

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

Hinweis:

Ich glaube, dies wäre ein einmaliger Vorgang und in Zukunft können Sie Joi verwenden npm-Paket oder Mungo-Schema-Validierer, um das Schreiben von null einzuschränken als Feldwerte. Wenn Sie Ihre Feldnamen auflisten können, als ob nicht zu viele plus Datensatzgröße viel zu hoch wären, dann versuchen Sie, die Aggregation mit $$REMOVE zu verwenden wie von '@thammada' vorgeschlagen.

Ab sofort Aggregation-Pipeline in .updateMany() wird von vielen Clients nicht unterstützt, nicht einmal von wenigen Mongo-Shell-Versionen - damals wurde mein Ticket zu ihnen mit .update() gelöst , wenn es nicht funktioniert, versuchen Sie es mit update + { multi : true } .