Mongoose (mongodb) пакетная вставка?

В настоящее время поддерживается поддержка вкладок Mongoose v3.6 +? Я искал несколько минут, но все, что соответствует этому запросу, пару лет, и ответ был однозначным.

Редактировать:

Для справки в будущем следует использовать Model.create (). create () принимает массив в качестве своего первого аргумента, поэтому вы можете передать свои документы для вставки в виде массива.

См. Http://mongoosejs.com/docs/api.html#model_Model.create

Model.create () vs Model.collection.insert (): более быстрый подход

Model.create() – плохой способ делать вставки, если вы имеете дело с очень большой массой. Это будет очень медленно . В этом случае вы должны использовать Model.collection.insert , который работает намного лучше . В зависимости от размера Model.create() даже сбой! Пробовал миллион документов, не повезло. Используя Model.collection.insert потребовалось всего несколько секунд.

 Model.collection.insert(docs, options, callback) 
  • docs – это массив вставленных документов;
  • options – необязательный объект конфигурации – см. документы
  • callback(err, docs) будет вызываться после того, как все документы будут сохранены или произойдет ошибка. В случае успеха документы – это массив сохраняемых документов.

Как указывает автор Mongoose, этот метод будет обходить любые процедуры проверки и напрямую обращаться к монгольскому драйверу. Это компромисс, который вы должны сделать, так как вы обрабатываете большой объем данных, иначе вы не сможете вставить его в свою базу данных вообще (помните, что мы говорим о сотнях тысяч документов здесь).

Простой пример

 var Potato = mongoose.model('Potato', PotatoSchema); var potatoBag = [/* a humongous amount of potato objects */]; Potato.collection.insert(potatoBag, onInsert); function onInsert(err, docs) { if (err) { // TODO: handle error } else { console.info('%d potatoes were successfully stored.', docs.length); } } 

Справка

  • Монгольская документация
  • Аарон Хекман в группах Google обсуждает объемные вставки

Mongoose 4.4.0 теперь поддерживает объемную вставку

Mongoose 4.4.0 вводит –true– объемную вставку с помощью метода модели .insertMany() . Это быстрее, чем цикл на .create() или предоставление ему массива.

Применение:

 var rawDocuments = [/* ... */]; Book.insertMany(rawDocuments) .then(function(mongooseDocuments) { /* ... */ }) .catch(function(err) { /* Error handling */ }); 

Или

 Book.insertMany(rawDocuments, function (err, mongooseDocuments) { /* Your callback function... */ }); 

Вы можете отслеживать его:

В самом деле, вы можете использовать метод «create» Mongoose, он может содержать массив документов, см. Этот пример:

 Candy.create({ candy: 'jelly bean' }, { candy: 'snickers' }, function (err, jellybean, snickers) { }); 

Функция обратного вызова содержит вставленные документы. Вы не всегда знаете, сколько предметов нужно вставить (фиксированная длина аргумента, как указано выше), чтобы вы могли их пропустить:

 var insertedDocs = []; for (var i=1; i 

Обновление: лучшее решение

Лучшее решение для использования Candy.collection.insert() вместо Candy.create() - используется в примере выше - потому что оно быстрее ( create() вызывает Model.save() для каждого элемента, так что он медленнее).

Дополнительную информацию см. В документации по Монго: http://docs.mongodb.org/manual/reference/method/db.collection.insert/

(спасибо arcseldon за указание этого)

Вы можете выполнить массовую вставку с использованием оболочки mongoDB, используя вставку значений в массив.

 db.collection.insert([{values},{values},{values},{values}]); 

Вы можете выполнять объемную вставку с использованием мангуста, как самый высокий балл. Но пример не может работать, это должно быть:

 /* a humongous amount of potatos */ var potatoBag = [{name:'potato1'}, {name:'potato2'}]; var Potato = mongoose.model('Potato', PotatoSchema); Potato.collection.insert(potatoBag, onInsert); function onInsert(err, docs) { if (err) { // TODO: handle error } else { console.info('%d potatoes were successfully stored.', docs.length); } } 

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

Кажется, что с использованием мангуста существует предел более чем 1000 документов, при использовании

 Potato.collection.insert(potatoBag, onInsert); 

Вы можете использовать:

 var bulk = Model.collection.initializeOrderedBulkOp(); async.each(users, function (user, callback) { bulk.insert(hash); }, function (err) { var bulkStart = Date.now(); bulk.execute(function(err, res){ if (err) console.log (" gameResult.js > err " , err); console.log (" gameResult.js > BULK TIME " , Date.now() - bulkStart ); console.log (" gameResult.js > BULK INSERT " , res.nInserted) }); }); 

Но это почти в два раза быстрее при тестировании 10000 документов:

 function fastInsert(arrOfResults) { var startTime = Date.now(); var count = 0; var c = Math.round( arrOfResults.length / 990); var fakeArr = []; fakeArr.length = c; var docsSaved = 0 async.each(fakeArr, function (item, callback) { var sliced = arrOfResults.slice(count, count+999); sliced.length) count = count +999; if(sliced.length != 0 ){ GameResultModel.collection.insert(sliced, function (err, docs) { docsSaved += docs.ops.length callback(); }); }else { callback() } }, function (err) { console.log (" gameResult.js > BULK INSERT AMOUNT: ", arrOfResults.length, "docsSaved " , docsSaved, " DIFF TIME:",Date.now() - startTime); }); } 

Я использовал async-forEach ( ссылка для асинхронной документации по npm-пакетам ) для достижения того же.

Мой fragment кода выглядит следующим образом. Я получаю документы в req.body.

 var forEach = require('async-foreach').forEach; exports.save_Ctrl = function (req, res) { // var l=req.body; // console.log("length:",l.length); forEach(req.body, function(item, index, object,err) { console.log(req.body[index]); var post = new saveObj(req.body[index]); //save model to MongoDB post.save(function (err) { if (err) { console.log('error saving :' + err.message); return err; } else { console.log("Post saved"); } }); }); } 

Совместное использование рабочего кода и соответствующего кода из нашего проекта:

 //documentsArray is the list of sampleCollection objects sampleCollection.insertMany(documentsArray) .then((res) => { console.log("insert sampleCollection result ", res); }) .catch(err => { console.log("bulk insert sampleCollection error ", err); }); 

Вот как можно сохранить данные с помощью insertMany и сохранить

1) Mongoose сохранить массив документов с insertMany навалом

 /* write mongoose schema model and export this */ var Potato = mongoose.model('Potato', PotatoSchema); /* write this api in routes directory */ router.post('/addDocuments', function (req, res) { const data = [/* array of object which data need to save in db */]; Potato.insertMany(data) .then((result) => { console.log("result ", result); res.status(200).json({'success': 'new documents added!', 'data': result}); }) .catch(err => { console.error("error ", err); res.status(400).json({err}); }); }) 

2) Mongoose сохранить массив документов с .save()

Эти документы будут сохраняться параллельно.

 /* write mongoose schema model and export this */ var Potato = mongoose.model('Potato', PotatoSchema); /* write this api in routes directory */ router.post('/addDocuments', function (req, res) { const saveData = [] const data = [/* array of object which data need to save in db */]; data.map((i) => { console.log(i) var potato = new Potato(data[i]) potato.save() .then((result) => { console.log(result) saveData.push(result) if (saveData.length === data.length) { res.status(200).json({'success': 'new documents added!', 'data': saveData}); } }) .catch((err) => { console.error(err) res.status(500).json({err}); }) }) }) 
  • NodeJS: Как декодировать строку с кодировкой base64 обратно в двоичную?
  • Ошибка установки углового с использованием npm из-за необходимости использовать строку
  • Получить имя хоста текущего запроса в node.js Express
  • Heroku NodeJS http to https ssl принудительное redirect
  • Попробуйте переустановить `node-sass` на узел 0.12?
  • Совместное использование сеансов между php и узлом
  • Облачные функции для Firebase - getaddrinfo ENOTFOUND
  • С трудом пытаться понять «next / next ()» в express.js
  • Node.js - найти домашнюю директорию в агностическом режиме платформы
  • пакет локальной установки npm для настраиваемого местоположения
  • Неизвестные события в nodejs / v8 flashgraph с использованием perf_events
  • Давайте будем гением компьютера.