sql >> Base de Datos >  >> NoSQL >> MongoDB

$ unset en múltiples campos en mongodb

En la versión de MongoDB>=3.2 :

Puede aprovechar .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);

Referencia: escritura masiva

En la versión de MongoDB>=4.2 :

Dado que quería eliminar varios campos (donde los nombres de los campos no se pueden enumerar o desconocer) que tienen null valor, intente debajo de la consulta:

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

Prueba: parque infantil mongo

Referencia: actualizar-con-una-canalización-de-agregación , canalización-de-agregación

Nota:

Creo que esta sería una operación única y en el futuro puedes usar Joi Paquete npm o validadores de esquema mongoose para restringir la escritura null 's como valores de campo. Si puede enumerar los nombres de sus campos como si no fueran demasiados más el tamaño del conjunto de datos es demasiado alto, intente usar la agregación con $$REMOVE como lo sugiere '@thammada'.

A partir de ahora, tubería de agregación en .updateMany() muchos clientes no lo admiten, incluso algunas versiones de mongo shell; en ese entonces, mi ticket para ellos se resolvió usando .update() , si no funciona, intente usar update + { multi : true } .