Starting Mongo 4.2, db.collection.update() can accept an aggregation pipeline, finally allowing the update/creation of a field based on another field:
// { a: "Hello", b: "World" }
// { a: "Olleh", b: "Dlrow" }
db.collection.updateMany(
{},
[ { $set: { active: { $eq: [ "$a", "Hello" ] } } } ]
)
// { a: "Hello", b: "World", active: true }
// { a: "Olleh", b: "Dlrow", active: false }
-
The first part
{}is the match query, filtering which documents to update (in our case all documents). -
The second part
[ { $set: { active: { $eq: [ "$a", "Hello" ] } } } ]is the update aggregation pipeline (note the squared brackets signifying the use of an aggregation pipeline).$setis a new aggregation operator and an alias of$addFields. Then any aggregation operator can be used within the$setstage; in our case a conditional equality check on which depends the value to use for the newactivefield.