简体   繁体   中英

How to FInd and Update Multiple Array Elements in mongodb

> db.Dashboards.find({user:{$regex:"adams"}}).pretty();
{
    "_id" : ObjectId("123"),
    "user" : "adam.adams",
    "widgets" : [
        {
            "_id" : ObjectId("124"),
            "column" : 1,
            "configMap" : {
                "coleg" : "bas.baser,cer.ceras,tom.tomsa"
            },
        }
    ]
}

I have a Mongo database that keeps records like the one above, unfortunately I need to find all users who have "cer.ceras" in the "coleg" field and then replace this with "per.peras"

I try with

db.Dashboards.find({widgets:{"$elemMatch":{configMap:{"$elemMatch":{coleg:/.*ceras.*/}}}}}}).pretty();

But I'm not finding anything for me

This may a bit complex.

Filter :

The criteria should work with $regex to find the occurrence of the text.

Update :

Require the update with aggregation pipeline.

  1. $set - Set widgets field.

    1.1. $map - Iterate the element in the widgets array and return a new array.

    1.1.1. $mergeObjects - Merge current iterate document with the result of 1.1.1.1 .

    1.1.1.1. A document with configMap array. With $mergeObjects to merge current iterate configMap document with the result 1.1.1.1.1 .

    1.1.1.1.1. A document with coleg field. With $replaceAll to replace all matching text "cer.ceras" to "per.peras".

Update Options

{ multi: true } aims to update multiple documents.

db.collection.update({
  widgets: {
    $elemMatch: {
      "configMap.coleg": {
        $regex: "cer\\.ceras"
      }
    }
  }
},
[
  {
    $set: {
      widgets: {
        $map: {
          input: "$widgets",
          in: {
            $mergeObjects: [
              "$$this",
              {
                configMap: {
                  $mergeObjects: [
                    "$$this.configMap",
                    {
                      coleg: {
                        $replaceAll: {
                          input: "$$this.configMap.coleg",
                          find: "cer.ceras",
                          replacement: "per.peras"
                        }
                      }
                    }
                  ]
                }
              }
            ]
          }
        }
      }
    }
  }
],
{
  multi: true
})

Demo @ Mongo Playground

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM