sql >> Database teknologi >  >> NoSQL >> MongoDB

Hvordan deaktiverer jeg alle felter undtagen et kendt sæt felter?

Hvis du er ligeglad med atomicitet, kan du gøre det med save :

doc = db.myCollection.findOne({"_id": 123});
for (k in doc.field_to_prune) {
  if (k === 'keep_field_1') continue;
  if (k === 'keep_field_2') continue;
  delete doc.field_to_prune[k];
}
db.myCollection.save(doc);

Hovedproblemet med denne løsning er, at den ikke er atomare. Så enhver opdatering til doc mellem findOne og save vil gå tabt.

Alternativet er faktisk at unset alle uønskede felter i stedet for at gemme doc :

doc = db.myCollection.findOne({"_id": 123});
unset = {};
for (k in doc.field_to_prune) {
  if (k === 'keep_field_1') continue;
  if (k === 'keep_field_2') continue;
  unset['field_to_prune.'+k] = 1;
}
db.myCollection.update({_id: doc._id}, {$unset: unset});

Denne løsning er meget bedre, fordi mongo kører update atomisk, så ingen opdatering går tabt. Og du behøver ikke en anden samling for at gøre, hvad du vil.



  1. Mongo sorteres efter dynamisk felt

  2. forbinder mongoose til mongoDB-atlas og nodejs

  3. 7 måder at tjekke din MongoDB-version på

  4. Hvordan konfigurerer jeg JedisConnectionFactory til at bruge SSL, så jeg ikke får fejlen:JedisDataException:ERR ukrypteret forbindelse er forbudt?