'Update multiple elements with different value in Mongoose

I have document containing lists. Lets say they are:

[
 {
  _id: 52b37432b2395e1807000008,
  name: ListA,
  order: 1,
  desc: 'More about List A'
 },
 {
  _id: 52b37432b2395e1807000009,
  name: LISTB,
  order: 2,
  desc: 'More about List B'
 },
 {
  _id: 52b37432b2395e180700000e,
  name: LISTC,
  order: 3,
  desc: 'More about List C'
 },
 {
  ..
 } 
]

Now I want to change their order field using a batch update. I have a JSON of updated_stage order

var updated_stage = [{_id: '52b37432b2395e1807000008', order:2},{_id: '52b37432b2395e180700000e', order:1}, {_id: '52b37432b2395e1807000009', order:3}]

Now I need to update LIST Model in Mongoose with the new array that I have. I know that I can update multiple documents with same value using Batch Update

Model.update({ }, { $set: { order: 10 }}, { multi: true }, callback);

But I have to update them by different values. How should I do it? Whats the most efficient way?



Solution 1:[1]

The most efficient way I could think of is to run a forEach loop over your updated_stage array.

Now take the _id and update order in the existing document in MongoDB.

Solution 2:[2]

Here my test with collection.forEach then call doc.save:

I use sync.each to know when all documents is save

var mongoose = require('mongoose'), async = require('async');

mongoose.connect('localhost', 'learn-mongoose');

var User = mongoose.model('User', {name: String});

async.series([
    function (done) {
        // remove User collection if exist
        User.remove(done);
    },

    function(done) {
        // re-create a collection with 2 users 'Mr One', 'Mr Two'
        User.create([{name: 'Mr One'}, {name: 'Mr Two'}], done);
    },

    function(done) {
        // upperCase user.name
        User.find(function(err, users) {
            async.each(users, function(user, callback) {
                user.name = user.name.toUpperCase();
                user.save(callback);
            }, done); // done is call when all users are save!!!!
        });
    },
    function(done) {
        // print result
        User.find(function(err, users) {
            console.log(users);
            done();
        });
    },
], function allTaskCompleted() {
    console.log('done');
    mongoose.disconnect();  
});

Solution 3:[3]

You guys can use mongoose/mongodb bulkwrite function.

Reference

enter image description here

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 kwoxer
Solution 2 damphat
Solution 3 marc_s