skip to Main Content

Here’s my schema

{ _id : Number,
  user1: {
   _id : Number, 
   userDetail : {
    userId : Number,
    userResult : String,
   }
  }, 
  user2 : {
   _id : Number, 
   userDetail : {
    userId : Number,
    userResult : String,
   }
  },
 createdAt : Date, 
 updatedAt : Date
}

Sample Doc look like this

{
    "_id" : ObjectId("625ebcabcc03685c273b2363"),
    "user1" : {
        "_id" : "625ebc9fcc03685c273b2207",
        "userDetail" : {
            "userId" : 7,
            "userResult" : "won"
        }
    },
    "user2" : {
        "_id" : "625ebc9fcc03685c273b2208",
        "userDetail" : {
            "userId" : 11,
            "userResult" : "lose"
        }
    },
    "createdAt" : ISODate("2022-04-19T13:44:11.781Z"),
    "updatedAt" : ISODate("2022-04-19T13:44:11.781Z")
}

Now I have nearly 1000 doc where this user has played. So I need to update the userId of all this users. How I am able to do this. I am getting all the user by

db.getCollection('matches').find({$or : [{'user1.userDetails.userId' : 7}, 
    {'user2.userDetails.userId' : 7}
]})

By the above query I am getting all the doc where userId 7 has played now I need to update the userId 7 to 10. How could I do that.

2

Answers


  1. Try this

    db.getCollection('matches').updateMany({$or : [{"user1.userDetails.userId" : 7}, 
    {"user2.userDetails.userId" : 7}]}, { $set: { "user1.userDetails.userId": 10 })
    
    Login or Signup to reply.
  2. You can use $cond:

    db.collection.update({
      $or: [{"user1.userDetail.userId": 7}, {"user2.userDetail.userId": 7}]
    },
    [
      {
        $set: {
          "user1.userDetail.userId": {
            $cond: [{$eq: ["$user1.userDetail.userId", 7]}, 10, "$user1.userDetail.userId"]},
          "user2.userDetail.userId": {
            $cond: [{$eq: ["$user2.userDetail.userId", 7]}, 10,
              "$user2.userDetail.userId"
            ]
          }
        }
      }
    ],
    {multi: true})
    

    As you cna see on the playground

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search