MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Как да отменя всички полета, освен известен набор от полета?

Ако не ви интересува атомарността, можете да го направите с 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);

Основният проблем на това решение е, че не е атомно. И така, всяка актуализация на doc между findOne и save ще бъдат загубени.

Алтернативата е действително да unset всички нежелани полета, вместо да запазите 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});

Това решение е много по-добро, защото mongo изпълнява update атомарно, така че нито една актуализация няма да бъде загубена. И нямате нужда от друга колекция, за да направите това, което искате.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. TypeError:db.collection не е функция

  2. Изключение в нишката на монитора при свързване към сървър localhost:27017 при достъп до MongoDB с Java

  3. Как да извлечете само избрани идентификатори на mongo, като използвате метода на spring data mongorepository?

  4. ElasticSearch и търсене в множество полета в PHP

  5. Mongoose - Увеличете стойност в масив от обекти