Вставка: insertOne и insertMany

Два метода вставки и что происходит, если в пачке встретится ошибочный документ.

insertOne добавляет один документ, insertMany — массив документов за один вызов.

insertOne — один документ

Самый частый способ добавить запись. Передаём объект, получаем подтверждение и _id:

db.users.insertOne({
  name: "Анна",
  age: 28,
  city: "Казань"
})

insertMany — пачка документов

Когда нужно загрузить сразу несколько записей, не вызывайте insertOne в цикле — это медленно. Передайте массив в insertMany:

db.users.insertMany([
  { name: "Борис", age: 34, city: "Москва" },
  { name: "Вера",  age: 22, city: "Казань" },
  { name: "Глеб",  age: 41, city: "Сочи" }
])

В ответ придёт список сгенерированных идентификаторов:

Результат:

{
  "acknowledged": true,
  "insertedIds": {
    "0": "ObjectId('...')",
    "1": "ObjectId('...')",
    "2": "ObjectId('...')"
  }
}

Документы могут различаться по структуре

В отличие от реляционной таблицы, в одной коллекции спокойно соседствуют документы с разным набором полей. Это законно:

db.users.insertMany([
  { name: "Дина", email: "[email protected]" },
  { name: "Егор", age: 30, phone: "+7900..." }
])

У Дины нет возраста, у Егора нет email — и это не ошибка. Гибкость схемы — особенность модели, но злоупотреблять ей не стоит: договорённость о структуре всё равно нужна (об этом в разделе про моделирование).

Упорядоченная и неупорядоченная вставка

По умолчанию insertMany вставляет документы по порядку и останавливается на первой ошибке: всё, что после неё, не вставится. Если хотите, чтобы база попыталась вставить остальные документы несмотря на сбойный, передайте опцию ordered: false:

db.users.insertMany(
  [ /* ... массив документов ... */ ],
  { ordered: false }
)

Неупорядоченный режим полезен при массовом импорте, когда отдельные «битые» записи не должны блокировать загрузку остальных.

Итог

  • insertOne — один документ, insertMany — массив за один вызов (быстрее цикла).
  • Документы в коллекции могут иметь разный набор полей.
  • По умолчанию пакетная вставка упорядочена и прерывается на первой ошибке; ordered: false позволяет продолжить.
Проверьте себя
1. Что эффективнее для добавления 100 документов?
A100 вызовов insertOne в цикле
BОдин вызов insertMany с массивом из 100 документов
CСпособы одинаковы по скорости
DСначала создать таблицу, потом вставлять
2. Что по умолчанию делает insertMany, встретив ошибочный документ в середине массива?
AОткатывает все ранее вставленные
BОстанавливается и не вставляет последующие документы
CПропускает ошибочный и продолжает
DЗавершается без какого-либо эффекта
3. Допустимо ли хранить в одной коллекции документы с разным набором полей?
AНет, все документы обязаны иметь одинаковые поля
BДа, схема гибкая — поля могут различаться
CТолько если задать схему заранее
DТолько в облаке Atlas
Поддержать проект