MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Jak rozbroić wszystkie pola z wyjątkiem znanego zestawu pól?

Jeśli nie zależy Ci na atomizacji, możesz to zrobić za pomocą 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);

Głównym problemem tego rozwiązania jest to, że nie jest atomowe. Tak więc każda aktualizacja doc między findOne i save zostaną utracone.

Alternatywą jest faktyczne unset wszystkie niechciane pola zamiast zapisywania 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});

To rozwiązanie jest znacznie lepsze, ponieważ mongo uruchamia update atomowo, więc żadna aktualizacja nie zostanie utracona. I nie potrzebujesz kolejnej kolekcji, aby robić to, co chcesz.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. mongo + pasażer:właściwy sposób na ponowne połączenie z bazą danych z poziomu kolei? jak zapewnić optymalną wydajność mongo?

  2. Jak mogę utworzyć zapytanie z mangustą z funkcji za pomocą parametru?

  3. Obsługa limitów czasu w Node.js i mongodb

  4. Jak czytać zbiory w kawałkach po 1000?

  5. Instalowanie wtyczek dla mangusty - pojawia się błąd