Поддерживает ли Mongoose v3.6 + пакетную вставку? Я искал несколько минут, но всему, что соответствует этому запросу, уже несколько лет, и ответ был однозначным отрицательным.
Редактировать:
Для дальнейшего использования, ответ - использовать Model.create()
. create()
принимает массив в качестве своего первого аргумента, поэтому вы можете передать свои документы для вставки в виде массива.
Ответы:
Model.create () против Model.collection.insert (): более быстрый подход
Model.create()
- плохой способ делать вставки, если вы имеете дело с очень большой массой. Это будет очень медленно . В этом случае вам следует использоватьModel.collection.insert
, который работает намного лучше . В зависимости от размера наваломModel.create()
может даже вылететь! Пробовал с миллионом документов, не повезло. ИспользованиеModel.collection.insert
заняло всего несколько секунд.docs
- массив вставляемых документов;options
необязательный объект конфигурации - см. документациюcallback(err, docs)
будет вызываться после того, как все документы будут сохранены или возникнет ошибка. В случае успеха docs - это массив сохраненных документов.Как указывает здесь автор Mongoose , этот метод будет обходить любые процедуры проверки и напрямую обращаться к драйверу Mongo. Это компромисс, на который вы должны пойти, так как вы обрабатываете большой объем данных, иначе вы вообще не сможете вставить их в свою базу данных (помните, что мы говорим здесь о сотнях тысяч документов).
Простой пример
Обновление 2019-06-22 : хотя
insert()
его все еще можно использовать нормально, оно устарело в пользуinsertMany()
. Параметры точно такие же, поэтому вы можете просто использовать его как замену, и все должно работать нормально (ну, возвращаемое значение немного другое, но вы, вероятно, все равно его не используете).Ссылка
источник
Model.collection
проходит напрямую через драйвер Mongo, вы теряете все удобные функции мангуста, включая проверку и хуки. Просто нужно иметь в виду.Model.create
теряет ловушки, но все равно проходит проверку. Если вы хотите все это, вы должны повторять иnew MyModel()
Mongoose 4.4.0 теперь поддерживает массовую вставку
Mongoose 4.4.0 представляет --true-- массовую вставку с методом модели
.insertMany()
. Это намного быстрее, чем цикл.create()
или предоставление массива.Использование:
Или
Вы можете отследить это:
источник
bulkWrite
? См. Здесь: stackoverflow.com/questions/38742475/…fatal error allocation failed
. Но если я использую collection.insert, он отлично работает.dateCreated : { type: Date, default: Date.now },
Действительно, вы можете использовать метод Mongoose create, он может содержать массив документов, см. Этот пример:
Функция обратного вызова содержит вставленные документы. Вы не всегда знаете, сколько элементов нужно вставить (фиксированная длина аргумента, как указано выше), поэтому вы можете просмотреть их в цикле:
Обновление: лучшее решение
Лучшее решение было бы использовать
Candy.collection.insert()
вместоCandy.create()
- использованного в приведенном выше примере - потому что оно быстрее (create()
вызываетModel.save()
каждый элемент, поэтому он медленнее).Дополнительную информацию см. В документации Mongo: http://docs.mongodb.org/manual/reference/method/db.collection.insert/
(спасибо arcseldon за указание на это)
источник
{type:'jellybean'}
вместо{type:'jelly bean'}
? Btw. что это за странные типы? Являются ли они частью Mongoose API?type
обычно в Mongoose зарезервировано для обозначения ADT объекта базы данных.Вы можете выполнить массовую вставку с помощью оболочки mongoDB, вставив значения в массив.
источник
YourModel.collection.insert()
collection.insert
ответ был дан за несколько недель до этого ответа и объяснен гораздо более подробно.Вы можете выполнить массовую вставку, используя мангуст, как ответ с наивысшим баллом. Но пример не может работать, он должен быть:
Не используйте экземпляр схемы для массовой вставки, вы должны использовать простой объект карты.
источник
Вот оба способа сохранения данных с помощью insertMany и save
1) Mongoose сохраняет массив документов
insertMany
оптом2) Mongoose сохраняет массив документов с
.save()
Эти документы сохранят параллельно.
источник
Кажется, что при использовании мангуста существует ограничение на более 1000 документов при использовании
Ты можешь использовать:
Но это почти в два раза быстрее при тестировании с 10000 документов:
источник
Совместное использование рабочего и актуального кода из нашего проекта:
источник
.insertMany
Решение уже было дано (и объяснили) в этом 2016 году ответ .