Как сохранить массив объектов в БД mongoose только одним вызовом? - PullRequest
16 голосов
/ 03 апреля 2012

Есть ли способ сохранить массив объекта JSON в mongodb с помощью только одного вызова?что-то вроде:

schemeObject.save(array_of_json_object, callback);

Я использую mongoosejs

Ответы [ 5 ]

31 голосов
/ 05 апреля 2014

Существует способ пакетной вставки с MongooseJS.Я не уверен, что это новая функция, поскольку этот вопрос был задан / получен ответ, но я подумал, что если кто-то придет сюда из поиска, он должен знать, как это сделать.

var array = [{ type: 'jelly bean' }, { type: 'snickers' }];
Candy.create(array, function (err, jellybean, snickers) {
  if (err) // ...
});

Здесьдокументы: http://mongoosejs.com/docs/api.html#model_Model.create

9 голосов
/ 03 апреля 2012

Я не думаю, что это возможно с mongooosejs.Однако вы можете использовать пакетную вставку mongodb, которая поддерживается изначально.

Полезные ссылки:

http://www.mongodb.org/display/DOCS/Inserting#Inserting-Bulkinserts

https://groups.google.com/forum/#!msg/mongoose-orm/IkPmvcd0kds/bZuYCN_orckJ

1 голос
/ 19 февраля 2018

Это работает и с мангустом

Laptop.insertMany(laptopData, function (err, laptop) {
  if (err) {
    console.log(err);
  };
  console.log(laptop);
});
0 голосов
/ 31 августа 2017

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

Вы можете начать использовать Q в качестве обещания по умолчанию для mongoose, используя следующий код:

const mongoose = require('mongoose');
mongoose.Promise = require('q').Promise;

Затем вы можете сохранить массив документов, как показано ниже. Допустим, мы храним массив пользовательских моделей, которые я показал в переменной users.

Q
  .all(users.map(curr => curr.save()))
  .then((results) => { //do something })
  .catch((err) => { //handle error })

.save() вернет обещание q и, используя функцию массива map, мы создадим массив обещаний, используя массив пользовательских моделей.

0 голосов
/ 03 апреля 2012

Как насчет этого? Я знаю, что он проходит по всему массиву .. не спрашивайте меня о Big O для этого ... вероятно, не лучший способ вставить, но работает только для некоторого начального дампа данных ..

var arr = // array of objects;
    res = [];

arr.forEach(function (item) {
    item.save(function (err) {
        res.push(err);
        if (res.length === arr.length)
        {
            // Done
        }
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...