MongoDB модифицирует данные методами вставки (insertOne/insertMany), обновления (updateOne/updateMany с операторами) и удаления (deleteOne/deleteMany). Обновления используют операторы обновления вместо замены целых документов — это важное различие.
Вставка
db.users.insertOne({ name: "Ann", age: 30 }); // → returns the inserted _id
db.users.insertMany([{ name: "Bob" }, { name: "Carol" }]); // bulk insert (efficient)
Обновление с операторами (не заменяйте весь документ)
// updateOne — filter (which doc) + update (with OPERATORS)
db.users.updateOne(
{ name: "Ann" },
{ $set: { age: 31, status: "active" } } // $set: change specific fields
);
// common update operators
{ $set: { field: value } } // set/change a field
{ $unset: { field: "" } } // remove a field
{ $inc: { count: 1 } } // increment a number
{ $push: { tags: "new" } } // add to an array
{ $pull: { tags: "old" } } // remove from an array
{ $addToSet: { tags: "x" } } // add to array only if not present
db.users.updateMany({ active: false }, { $set: { archived: true } }); // update all matching
Важно: обновления используют операторы ($set, $inc, $push и т. д.) для изменения конкретных полей. Без оператора вы заменили бы весь документ — частая ошибка:
// ❌ this REPLACES the whole document (loses other fields!)
db.users.updateOne({ name: "Ann" }, { age: 31 }); // Ann now has ONLY age!
// ✅ use $set to change just the field
db.users.updateOne({ name: "Ann" }, { $set: { age: 31 } });
Удаление
db.users.deleteOne({ name: "Ann" }); // delete the first match
db.users.deleteMany({ active: false }); // delete all matching
db.users.deleteMany({}); // ⚠️ deletes ALL documents!
Upsert — вставка, если не найдено
db.users.updateOne(
{ email: "[email protected]" },
{ $set: { name: "Ann" } },
{ upsert: true } // if no match, INSERT a new document
);
Почему это важно
Операции вставки, обновления и удаления — это то, как приложения модифицируют данные в MongoDB, что является фундаментом любого приложения, работающего с данными, поэтому их понимание критично.
Знание методов (insertOne/insertMany для создания, updateOne/updateMany для изменения, deleteOne/deleteMany для удаления) охватывает основы.
Самый важный и часто неправильно понимаемый момент — это то, что обновления в MongoDB используют операторы обновления ($set, $inc, $push, $pull и т. д.) для изменения конкретных полей — и, что критично, забыв оператор, вы заменяете весь документ (известная ошибка, когда updateOne({...}, {age: 31}) удаляет все другие поля, оставляя только age), поэтому понимание того, что всегда нужно использовать $set (и другие операторы) для обновления полей, критично для корректности.
Знание распространённых операторов ($set, $inc для счётчиков, $push/$pull/$addToSet для массивов — операторы массивов особенно важны, учитывая обилие массивов в документах MongoDB) — это важное повседневное знание.
Понимание upsert ({ upsert: true } — вставка, если совпадение не найдено, паттерн вставки-или-обновления MongoDB) полезно для распространённого паттерна вставки-или-обновления.
Также стоит учитывать опасность deleteMany({}) (удаление всего — похоже на опасность отсутствия WHERE в SQL).
Поскольку модификация данных — это фундамент, а операторные обновления MongoDB (с опасностью замены документа), операторы массивов и upsert — это то, как вы правильно изменяете данные, понимание вставки/обновления/удаления — особенно критическое различие использования операторов (избегание случайной замены документа) — это необходимое базовое знание для любой разработки на MongoDB, где опасность использования операторов в частности является частым источником реальных ошибок.
