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: ''.
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 :)
2as @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