Update all documents in a collection in Mongodb with a new field

1.7k Views Asked by At

I have a collection named employees with documents like.

{
first_name:"john",
last_name:"doe"
}

I want to run an update query which adds a new field like {name:'john doe'}

I know it can be done like this

db.employees.find({}).forEach(doc=>db.employees.update({"_id":doc._id},{$set:{name:doc.first_name+"-"+doc.last_name}}))

but its taking a lot of time when i am using mongo compass with db running in atlas.

3

There are 3 best solutions below

0
rickhg12hs On BEST ANSWER

Here's one way you could do it by using an update aggregation pipeline.

db.employees.update({
  "first_name": {"$exists": true},
  "last_name": {"$exists": true},
  "name": {"$exists": false}
},
[
  {
    "$set": {
      "name": {
        "$concat": ["$first_name", " ", "$last_name"]
      }
    }
  }
],
{"multi": true}
)

Try it on mongoplayground.net.

1
Dump Eldor On

Use the db.collection.updateMany() to update all documents that match a specified filter.

for example: To update all documents in the sample_airbnb.listingsAndReviews collection to update where security_deposit is less than 100:

    use sample_airbnb

db.listingsAndReviews.updateMany(
  { security_deposit: { $lt: 100 } },
  {
    $set: { security_deposit: 100, minimum_nights: 1 }
  }
)

The update operation uses the $set operator to update the value of the security_deposit field to 100 and the value of the minimum_nights field to 1.

this was taken from :https://www.mongodb.com/docs/mongodb-shell/crud/update/

0
Wilhelm Mauch On

db.collection.updateMany(filter, update, options) => updateMany

db.employees.updateMany({
  "first_name": {"$exists": true},
  "last_name": {"$exists": true},
  "name": {"$exists": false}
},  
{
  "$set": {
    "name": { "$concat": ["$first_name", "-", "$last_name"] }
  }
}, 
{ upsert: true}
)

! Don't forget use db_name first, to select your db.