简体   繁体   中英

How to save an array of objects to mongoose DB with only one call?

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

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

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

This works with mongoose as well

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

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.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM