1
collectionABC
/* 1 */
{
    "DealerId" : "39823398",
    "VehicleCategory" : [ 
        {
            "seqId" : "23987134983471982134HAD",
            "vehicleName" : "BMW",
            "vehicleImage" : "images/vehicle/270029.gif"
        }, 
        {
            "seqId" : "293874KJHKHKJH7878",
            "vehicleName" : "Audi",
            "vehicleImage" : "images/vehicle/27022398.gif"
        }
    ]
}

/* 2 */
{
    "DealerId" : "3987398",
    "VehicleCategory" : [ 
        {
            "seqId" : "2234423987134983471982134HAD",
            "vehicleName" : "Honda",
            "vehicleImage" : "images/vehicle/270029.gif"
        }, 
        {
            "seqId" : "9834293874KJHKHKJH7878",
            "vehicleName" : "Toyota",
            "vehicleImage" : "images/vehicle/27022398.gif"
        }
    ]
}

I have 100k docs with the above pattern and needs to be update from ".gif" to ".png" for all existing the docs. The rest of everything should be remain same.

After update the documents the result should be looks like:

collectionABC
/* 1 */
{
    "DealerId" : "39823398",
    "VehicleCategory" : [ 
        {
            "seqId" : "23987134983471982134HAD",
            "vehicleName" : "BMW",
            "vehicleImage" : "images/vehicle/270029.png"
        }, 
        {
            "seqId" : "293874KJHKHKJH7878",
            "vehicleName" : "Audi",
            "vehicleImage" : "images/vehicle/27022398.png"
        }
    ]
}

/* 2 */
{
    "DealerId" : "3987398",
    "VehicleCategory" : [ 
        {
            "seqId" : "2234423987134983471982134HAD",
            "vehicleName" : "Honda",
            "vehicleImage" : "images/vehicle/270029.png"
        }, 
        {
            "seqId" : "9834293874KJHKHKJH7878",
            "vehicleName" : "Toyota",
            "vehicleImage" : "images/vehicle/27022398.png"
        }
    ]
}

Any thoughts how we can do it in Mongo? Very much appreciated.

1 Answers1

0
bulk_update = db.media.initializeUnorderedBulkOp()
db.media.find().forEach(function(e, i) {
   e.VehicleCategory.forEach(function(vehicle, index){
          vehicle.vehicleImage = vehicle.vehicleImage.replace('.gif','.png')
    })
   bulk_update.find({"DealerId": e.DealerId}).update({"$set": e})
})
bulk_update.execute()

If 100k records are there, I would suggest doing the update with a loop selecting 10k at a time, based on your MongoDB capacity.

I am a python guy, sorry if have not used proper JS.

daemon24
  • 1,388
  • 1
  • 11
  • 23