Mongoose (mongodb) batch insert?

后端 未结 8 1939
灰色年华
灰色年华 2020-11-27 10:15

Does Mongoose v3.6+ support batch inserts now? I\'ve searched for a few minutes but anything matching this query is a couple of years old and the answer was

相关标签:
8条回答
  • 2020-11-27 10:30

    You can perform bulk insert using mongoDB shell using inserting the values in an array.

    db.collection.insert([{values},{values},{values},{values}]);
    
    0 讨论(0)
  • 2020-11-27 10:32

    Mongoose 4.4.0 now supports bulk insert

    Mongoose 4.4.0 introduces --true-- bulk insert with the model method .insertMany(). It is way faster than looping on .create() or providing it with an array.

    Usage:

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

    Or

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

    You can track it on:

    • https://github.com/Automattic/mongoose/issues/723
    • https://github.com/Automattic/mongoose/blob/1887e72694829b62f4e3547283783cebbe66b46b/lib/model.js#L1774
    0 讨论(0)
  • 2020-11-27 10:37

    Indeed, you can use the "create" method of Mongoose, it can contain an array of documents, see this example:

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

    The callback function contains the inserted documents. You do not always know how many items has to be inserted (fixed argument length like above) so you can loop through them:

    var insertedDocs = [];
    for (var i=1; i<arguments.length; ++i) {
        insertedDocs.push(arguments[i]);
    }
    

    Update: A better solution

    A better solution would to use Candy.collection.insert() instead of Candy.create() - used in the example above - because it's faster (create() is calling Model.save() on each item so it's slower).

    See the Mongo documentation for more information: http://docs.mongodb.org/manual/reference/method/db.collection.insert/

    (thanks to arcseldon for pointing this out)

    0 讨论(0)
  • 2020-11-27 10:45

    Here are both way of saving data with insertMany and save

    1) Mongoose save array of documents with insertMany in bulk

    /* 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 array of documents with .save()

    These documents will save parallel.

    /* 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});
            })
        })
    })
    
    0 讨论(0)
  • 2020-11-27 10:47

    You can perform bulk insert using mongoose, as the highest score answer. But the example cannot work, it should be:

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

    Don't use a schema instance for the bulk insert, you should use a plain map object.

    0 讨论(0)
  • 2020-11-27 10:47

    Sharing working and relevant code from our project:

    //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);
        });
    
    0 讨论(0)
提交回复
热议问题