sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur avaktiverar jag alla fält utom en känd uppsättning fält?

Om du inte bryr dig om atomicitet kan du göra 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);

Huvudproblemet med denna lösning är att den inte är atomär. Så, alla uppdateringar till doc mellan findOne och save kommer att gå förlorad.

Alternativet är att faktiskt unset alla oönskade fält istället för att spara 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});

Denna lösning är mycket bättre eftersom mongo kör update atomärt, så ingen uppdatering kommer att gå förlorad. Och du behöver ingen annan samling för att göra vad du vill.



  1. Bestående data från Redis till MongoDB för datalagring

  2. Hur reparerar jag min mongodb?

  3. MapReducera blandning och sortering i Hadoop

  4. Hur man returnerar bara värdet i MongoDB