sql >> Database >  >> NoSQL >> MongoDB

$uitgeschakeld op meerdere velden in mongodb

Op MongoDB-versie>=3.2 :

U kunt profiteren van .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: bulkschrijven

Op MongoDB-versie>=4.2 :

Omdat u meerdere velden wilde verwijderen (waar veldnamen niet kunnen worden weergegeven of onbekend zijn) met null waarde, probeer onderstaande vraag:

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

Ref: update-met-een-aggregatie-pijplijn , aggregatie-pijplijn

Opmerking:

Ik geloof dat dit een eenmalige operatie zou zijn en in de toekomst kun je Joi . gebruiken npm-pakket of mongoose-schemavalidators om het schrijven van null te beperken 's als veldwaarden. Als u uw veldnamen kunt opsommen alsof niet te veel plus datasetgrootte veel te hoog is, probeer dan aggregatie te gebruiken met $$REMOVE zoals voorgesteld door '@thammada'.

Vanaf nu aggregatie-pijplijn in .updateMany() wordt niet door veel klanten ondersteund, zelfs door weinig mongo shell-versies - toen werd mijn ticket aan hen opgelost door .update() te gebruiken , als het niet werkt, probeer dan update + { multi : true } . te gebruiken .



  1. Wat is het maximale aantal shards dat MongoDB kan hebben?

  2. Hoe voer ik een id-arrayquery uit in Mongoose?

  3. Mongoose.js instance.save() callback wordt niet geactiveerd

  4. Is er een manier om een ​​specifieke sleutel te lokaliseren op een specifieke redis-instantie in clustermodus?