How can I update multiple documents in mongoose?

I found the following script:

Device.find(function(err, devices) { devices.forEach(function(device) { device.cid = ''; device.save(); }); }); 

MongoDB has the "multi" flag for an update over multiple documents but I wasn't able to get this working with mongoose. Is this not yet supported or am I doing something wrong?

Device.update({}, {cid: ''}, false, true, function (err) { //... }); 

7 Answers

Currently I believe that update() in Mongoose has some problems, see: and .

However, check the docs for update: (its under Model). The definition is:

Earlier Solution(Depreciated after mongoose 5+ version)

Model.update = function (query, doc, options, callback) { ... } 

You need to pass the options inside an object, so your code would be:

Model.update = function ({}, {cid: ''}, {multi: true}, function(err) { ... }); 

New Solution

Model.updateMany = function (query, doc, callback) { ... } Model.updateMany = function ({}, {cid: ''}, function(err) { ... }); 

I believe that Mongoose wraps your cid in a $set, so this is not the same as running that same update in the mongo shell. If you ran that in the shell then all documents would be replaced by one with a single cid: ''.

2

Those answers are deprecated. This is the actual solution:

Device.updateMany({}, { cid: '' }); 

You have to use the multi: true option

Device.update({},{cid: ''},{multi: true}); 

as mentioned in the mongoose documents this is how we do this:

db.collection.updateMany(condition, update, options, callback function)

so this is an example based on the docs:

 // creating arguments let conditions = {}; let update = { $set : { title : req.body.title, description : req.body.description, markdown : req.body.markdown } }; let options = { multi: true, upsert: true }; // update_many :) YourCollection.updateMany( conditions, update, options,(err, doc) => { console.log(req.body); if(!err) { res.redirect('/articles'); } else { if(err.name == "ValidationError"){ handleValidationError(err , req.body); res.redirect('/new-post'); }else { res.redirect('/'); } } }); 

this worked fine for me, I hope it helps :)

2

as @sina mentioned:

let conditions = {}; let options = { multi: true, upsert: true }; Device.updateMany(conditions , { cid: '' },options ); 

you can add a callback function after options but it's not necessary.

You can try the following way

try { const icMessages = await IcMessages.updateMany({ room: req.params.room }, { "$set": { seen_status_2: "0" } }, { "multi": true }); res.json(icMessages) } catch (err) { console.log(err.message) res.status(500).json({ message: err.message }) } 
await Device.updateMany({_id: {$in: cid}},{ $set: {columnNameHere: "columnValueHere"}},{multi:true,upsert: true,new: true}); 
1

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

You Might Also Like