pheobas
pheobas

Reputation: 314

A MongoDB update query to update array values to their lowercase value

I have a Mongo collection of states, where each state contains an array of cities:

{
   "_id":"636d1137cf1e57408486f795",
   "state":"new york",
   "cities":[
      {
         "cityid":"62bd8fa5396ba8aef4ad1041",
         "name":"Yonkers"
      },
      {
         "cityid":"62bd8fa5396ba8aef4ad1043",
         "name":"Syracuse"
      }
   ]
}

I need an update query that will lowercase every cities.name in the collection. I can do an update with a literal value e.g.

db.states.updateMany(
   {},
   { $set: { "cities.$[].name" : "some_value" } }
)

... , but I need the value to be based on the existing value. The closest I can get is something like this (but that doesn't work -- FieldPath field names may not start with '$')

db.states.updateMany(
   {},
   { $set: { "cities.$[].name" : { $toLower:  "cities.$[].name"} } }
)

Upvotes: 0

Views: 31

Answers (1)

ray
ray

Reputation: 15257

You can chain up $map and $mergeObjects to perform the update. Put it in an aggregation pipeline in update.

db.collection.update({},
[
  {
    $set: {
      cities: {
        "$map": {
          "input": "$cities",
          "as": "c",
          "in": {
            "$mergeObjects": [
              "$$c",
              {
                "name": {
                  "$toLower": "$$c.name"
                }
              }
            ]
          }
        }
      }
    }
  }
])

Mongo Playground

Upvotes: 1

Related Questions