20

Is there any way to save an array of JSON object to a mongodb with only one call? something like:

schemeObject.save(array_of_json_object, callback);

I'm using mongoosejs

gideon
  • 19,329
  • 11
  • 72
  • 113
jAckOdE
  • 2,402
  • 8
  • 37
  • 67

6 Answers6

32

There is a way to batch insert with MongooseJS. I'm not sure if it's a new feature since this question was asked/answered, but I figured if someone were to come here from a search, they should know the way to do it.

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

Here are the docs: http://mongoosejs.com/docs/api.html#model_Model.create

Dan Mandle
  • 5,608
  • 3
  • 23
  • 26
  • 4
    That should work if we want to create new docs. How about update a array or docs that returned from a query? – jAckOdE Apr 10 '14 at 06:41
  • For that, I think you'd have to do a find() then a forEach() on the result, update the values and do a save() for each of them. But I'm pretty new to Mongoose myself. – Dan Mandle Apr 11 '14 at 14:23
10

I do not think its possible with mongooosejs. You can however use BATCH insert of mongodb ,which is supported natively.

Helpful links:

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

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

DhruvPathak
  • 42,059
  • 16
  • 116
  • 175
2

This works with mongoose as well

Laptop.insertMany(laptopData, function (err, laptop) {
  if (err) {
    console.log(err);
  };
  console.log(laptop);
});
Admir
  • 2,876
  • 1
  • 19
  • 19
0

Another workaround that I've used. If you are using mongoose with promises, you can do this using Q.

You can start using Q as the default promise for mongoose using the below code:

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

Then you can save an array of documents like below. Let's say we are storing an array of User models, which I've shown in users variable.

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

.save() will return a q promise and using array map function, we'll create a promise array using the user models array.

Deepal
  • 1,729
  • 5
  • 24
  • 34
0

I got the solution instead of using

new model_name({
your data
})

use this

model_name.create({your data}).then(res).catch(err) 

// simple promise things

anish jain
  • 11
  • 1
  • 2
0

How about something like this? I know it loops through the entire array.. dont ask me about the Big O for this.. probably not the best way to insert but works for just an initial data dump of some sort..

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

arr.forEach(function (item) {
    item.save(function (err) {
        res.push(err);
        if (res.length === arr.length)
        {
            // Done
        }
    });
});