MongoDB
Как добавить данные в существующий документ MongoDB
Чтобы добавить данные в существующий документ MongoDB, используйте updateOne() или updateMany() с оператором обновления. Для нового поля чаще всего подходит $set, для добавления элемента в массив — $push, для добавления без дублей — $addToSet
Допустим, есть документ пользователя:
{
_id: ObjectId("665f1c1a7b8c2e0012a4d111"),
name: "Dinar",
email: "dinar@example.com",
tags: ["author"]
}
Добавить новое поле
db.users.updateOne(
{ email: "dinar@example.com" },
{
$set: {
city: "Sochi"
}
}
)
Проверка:
db.users.findOne({ email: "dinar@example.com" })
Если поля city раньше не было, MongoDB добавит его. Если поле уже было, $set обновит значение
Добавить вложенный объект
db.users.updateOne(
{ email: "dinar@example.com" },
{
$set: {
profile: {
role: "teacher",
level: "middle"
}
}
}
)
Если нужно добавить только одно вложенное поле, используйте точечную запись:
db.users.updateOne(
{ email: "dinar@example.com" },
{
$set: {
"profile.telegram": "@aglamov"
}
}
)
Так вы не перезапишете весь объект profile
Добавить элемент в массив
db.users.updateOne(
{ email: "dinar@example.com" },
{
$push: {
tags: "mongodb"
}
}
)
Если не хотите добавлять повтор:
db.users.updateOne(
{ email: "dinar@example.com" },
{
$addToSet: {
tags: "mongodb"
}
}
)
Частые ошибки
Заменили документ вместо добавления поля
Если выполнить обновление без $set, можно случайно заменить документ. Для добавления поля используйте оператор обновления:
{ $set: { city: "Sochi" } }
Перезаписали вложенный объект
Если сделать $set: { profile: {...} }, старый profile заменится целиком. Для отдельного поля используйте "profile.telegram"
Получили дубли в массиве
$push всегда добавляет элемент. Если нужен уникальный набор, используйте $addToSet
Не проверили matchedCount
После обновления посмотрите результат:
const result = db.users.updateOne(...)
Если matchedCount равен 0, фильтр не нашел документ
Когда использовать updateMany
updateMany() нужен, если одно и то же поле нужно добавить сразу нескольким документам. Например, всем пользователям без статуса можно поставить значение по умолчанию:
db.users.updateMany(
{ status: { $exists: false } },
{
$set: {
status: "active"
}
}
)
После массового обновления проверьте количество документов:
db.users.countDocuments({ status: "active" })
Если меняете рабочую коллекцию, сначала протестируйте фильтр через find(), чтобы не обновить лишние записи
Короткий чек-лист
- Найдите документ точным фильтром.
- Для поля используйте
$set. - Для массива используйте
$pushили$addToSet. - Для вложенного поля используйте точечную запись.
- Проверьте результат через
findOne().
Что почитать дальше по MongoDB
Если нужен общий маршрут по теме, откройте рубрику MongoDB. Для соседних задач пригодятся эти разборы:
- Как в MongoDB изменить тип поля и сохранить данные
- Как обновлять другой документ в событиях Doctrine MongoDB ODM
- Монгодб: что это и как в ней хранятся данные
- Создание коллекции одежды в MongoDB
Как проверить результат на практике
Для MongoDB-материала полезно делать три проверки: сначала выполнить команду на маленьком наборе тестовых документов, затем посмотреть результат через find() или MongoDB Compass, а после этого повторить действие на копии реальной структуры данных. Если запрос меняет документы, сначала запускайте его с фильтром на один документ и только потом расширяйте условие
Еще одна хорошая привычка — записывать исходное состояние и ожидаемый результат. Например: было три документа, после обновления изменился только один; был массив из пяти элементов, после операции остался нужный элемент; индекс появился в getIndexes(). Такая проверка быстро показывает, что вы исправили именно задачу, а не просто получили команду без ошибки