sql >> Database >  >> NoSQL >> MongoDB

Hoe kan ik alle velden uitschakelen, behalve een bekende set velden?

Als je niet om atomiciteit geeft, kun je het doen met 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);

Het belangrijkste probleem van deze oplossing is dat het niet atomair is. Dus elke update naar doc tussen findOne en save zal verloren gaan.

Alternatief is om daadwerkelijk unset alle ongewenste velden in plaats van het doc . op te slaan :

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

Deze oplossing is veel beter omdat mongo update uitvoert atomair, dus er gaat geen update verloren. En je hebt geen andere verzameling nodig om te doen wat je wilt.



  1. Eenvoudige manier om code te genereren met Mongoose en Node.js en Underscore?

  2. Docker-compose en mongoDB:kan WiredTiger niet opstarten onder een compatibiliteitsversie?

  3. MongoDB 3 Java controleren of verzameling bestaat

  4. Hoe krijg ik de ontkenning van een mongoid-query?