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(), чтобы не обновить лишние записи

Короткий чек-лист

  1. Найдите документ точным фильтром.
  2. Для поля используйте $set.
  3. Для массива используйте $push или $addToSet.
  4. Для вложенного поля используйте точечную запись.
  5. Проверьте результат через findOne().

Что почитать дальше по MongoDB

Если нужен общий маршрут по теме, откройте рубрику MongoDB. Для соседних задач пригодятся эти разборы:

Как проверить результат на практике

Для MongoDB-материала полезно делать три проверки: сначала выполнить команду на маленьком наборе тестовых документов, затем посмотреть результат через find() или MongoDB Compass, а после этого повторить действие на копии реальной структуры данных. Если запрос меняет документы, сначала запускайте его с фильтром на один документ и только потом расширяйте условие

Еще одна хорошая привычка — записывать исходное состояние и ожидаемый результат. Например: было три документа, после обновления изменился только один; был массив из пяти элементов, после операции остался нужный элемент; индекс появился в getIndexes(). Такая проверка быстро показывает, что вы исправили именно задачу, а не просто получили команду без ошибки

Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные

Настройки cookie

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x