Вставка: 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позволяет продолжить.