way to update multiple documents with different values

You can not update two documents at once with a MongoDB query. You will always have to do that in two queries. You can of course set a value of a field to the same value, or increment with the same number, but you can not do two distinct updates in MongoDB with the same query.


From mongodb 4.2 you can do using pipeline in update using $set operator

there are many ways possible now due to many operators in aggregation pipeline though I am providing one of them

    exports.updateDisplayOrder = async keyValPairArr => {
    try {
        let data = await ContestModel.collection.update(
            { _id: { $in: keyValPairArr.map(o => o.id) } },
            [{
                $set: {
                    displayOrder: {
                        $let: {
                            vars: { obj: { $arrayElemAt: [{ $filter: { input: keyValPairArr, as: "kvpa", cond: { $eq: ["$$kvpa.id", "$_id"] } } }, 0] } },
                            in:"$$obj.displayOrder"
                        
                        }
                    }
                }
            }],
            { runValidators: true, multi: true }
        )

        return data;
    } catch (error) {
        throw error;
    }
   }

example key val pair is: [{"id":"5e7643d436963c21f14582ee","displayOrder":9}, {"id":"5e7643e736963c21f14582ef","displayOrder":4}]


Since MongoDB 4.2 update can accept aggregation pipeline as second argument, allowing modification of multiple documents based on their data.

See https://docs.mongodb.com/manual/reference/method/db.collection.update/#modify-a-field-using-the-values-of-the-other-fields-in-the-document

Excerpt from documentation:

Modify a Field Using the Values of the Other Fields in the Document

Create a members collection with the following documents:

db.members.insertMany([
  { "_id" : 1, "member" : "abc123", "status" : "A", "points" : 2, "misc1" : "note to self: confirm status", "misc2" : "Need to activate", "lastUpdate" : ISODate("2019-01-01T00:00:00Z") },
  { "_id" : 2, "member" : "xyz123", "status" : "A", "points" : 60, "misc1" : "reminder: ping me at 100pts", "misc2" : "Some random comment", "lastUpdate" : ISODate("2019-01-01T00:00:00Z") }
])

Assume that instead of separate misc1 and misc2 fields, you want to gather these into a new comments field. The following update operation uses an aggregation pipeline to:

  • add the new comments field and set the lastUpdate field.
  • remove the misc1 and misc2 fields for all documents in the collection.
db.members.update(
  { },
  [
     { $set: { status: "Modified", comments: [ "$misc1", "$misc2" ], lastUpdate: "$$NOW" } },
     { $unset: [ "misc1", "misc2" ] }
  ],
  { multi: true }
)

You can use db.collection.bulkWrite() to perform multiple operations in bulk. It has been available since 3.2.

It is possible to perform operations out of order to increase performance.