MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Làm cách nào để hủy đặt tất cả các trường ngoại trừ một nhóm trường đã biết?

Nếu bạn không quan tâm đến tính nguyên tử thì bạn có thể làm điều đó với 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);

Vấn đề chính của giải pháp này là nó không phải là nguyên tử. Vì vậy, bất kỳ bản cập nhật nào cho doc giữa findOnesave sẽ bị mất.

Cách khác là thực sự unset tất cả các trường không mong muốn thay vì lưu 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});

Giải pháp này tốt hơn nhiều vì mongo chạy update về mặt nguyên tử, vì vậy không có bản cập nhật nào sẽ bị mất. Và bạn không cần một bộ sưu tập khác để làm những gì bạn muốn.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Khi nào một tài liệu mongodb sẽ hết hạn sau khi nó được cập nhật?

  2. Làm cách nào để gọi các thuộc tính nằm trong một tập hợp khác trong Mảng con?

  3. So sánh các mẫu triển khai cho MongoDB

  4. Định dạng ngày Mongoose

  5. Làm cách nào để cập nhật tài liệu Mongo sau khi chèn nó?