I am looking for a way to update multiple MongoDB documents in one instruction. I am aware there is a updateMany() query, but it requires a strict filter parameter in order to update multiple documents.
I have an array of objects I’d like to update like so:
const objectsToUpdate = [ { _id : 1, field : "a" }, { _id : 2, field : "b" }, { _id : 3, field : "c" } ]
The array is based on a file I retrieve from an FTP server. I check this file against the database and populate it if there are differences. I could iterate through the array and perform the findOneAndUpdate() query but I have to handle up to 5000 documents in a task.
I am looking for the update counterpart of insertMany() where the documents are looked up by _id and updated in one single query. Is this doable with Mongoose?
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
You can use bulkWrite
that would be faster than multiple updateOne
as there is only one round trip to MongoDB.
const bulkOps = objectsToUpdate.map(obj => { return { updateOne: { filter: { _id: obj._id }, // If you were using the MongoDB driver directly, you'd need to do // `update: { $set: { field: ... } }` but mongoose adds $set for you update: { field: obj[field] } } } }) MongooseModel.bulkWrite(bulkOps).then((res) => { console.log("Documents Updated", res.modifiedCount) })
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0