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

4
  • Can you please update the correct answer? Commented May 20, 2015 at 20:38
  • @IcyFlame Your linked post is technically a duplicate of this one. Commented Sep 8, 2016 at 21:38
  • @DanMandle right! I didn't notice the dates. Thanks for pointing out. Commented Sep 10, 2016 at 6:15
  • You can also try this: stackoverflow.com/questions/16726330/… Commented Sep 10, 2016 at 6:15

6 Answers 6

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

Sign up to request clarification or add additional context in comments.

2 Comments

That should work if we want to create new docs. How about update a array or docs that returned from a query?
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.
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

1 Comment

the answer is found in the second link. Thanks
2

This works with mongoose as well

Laptop.insertMany(laptopData, function (err, laptop) {
  if (err) {
    console.log(err);
  };
  console.log(laptop);
});

Comments

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
        }
    });
});

1 Comment

that woudnt be a batch insert if its one by one!
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.

Comments

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.