Will
Will

Reputation: 8641

editing an element of an array within all docs Mongodb

I have a doc structure as:

{
_id: "fe50fdee-4ea3-4824-94af-f369633c0c7a",
_class: "com.tracking.daoservice.model.TrackingData",
modified: ISODate("2014-09-10T23:38:48.407Z"),
eventtype: "William-Test",
eventdata: {
    QueryDate: "01-APR-2014",
    SearchQuery: {
        keyword: "Java",
        location: "Santa Clara, CA",
        Facet: "skill~java~perl|workAuth~USC",
        SearchAgentId: "4299"
    },
    Viewed: [
        {
            ViewedID: "8992ade400a",
            Dockey: "3323aba3233",
            PID: "32399a",
            actionsTaken: "email|direct message|report seeker",
            viewDate: "01-APR-2014",
            MessageSent: "true",
            Message: [
                {
                    MessageID: "123aca323",
                    Delivered: "True",
                    Opened: "True",
                    ClickThroughRate: "NotBad",
                    MessageDate: "02-APR-2014",
                    Response: [
                        {
                            ResponseId: "a323a9da",
                            ResponseDate: "23-APR-2014"
                        }
                    ]
                }
            ]
        }
    ]
},
eventsource: "API-Dev Test - JMachine",
sourceip: "myIp",
entityid: "TmoneyBunnyWunny",
groupid: "Dice",
datecreated: ISODate("2014-09-10T23:38:48.405Z")
}

I need to change the date values, such as viewDate: "01-APR-2014" I have been trying to write a query for this.

 db.TRACKING_DATA.find().forEach(function(doc) {      db.TRACKING_DATA.update(         { "_id": doc._id },         { "$set": {              "eventdata.Viewed.$.viewDate": new Date( doc.eventdata.Viewed.viewDate)         }}     ) });

However this returns, however there is no change to the document. I have used the $ as there is only one element within the array.

Am I missing something simple here?

Cheers

Upvotes: 0

Views: 48

Answers (1)

mallik
mallik

Reputation: 567

I noticed that your eventdata.Querydata is same as Viewed.viewddate in that case below query will update the data

 db.TRACKING_DATA.find().forEach(function(doc) { db.TRACKING_DATA.update({ "_id": doc._id ,"eventdata.Viewed.viewDate":doc.eventdata.QueryDate},         { "$set": {              "eventdata.Viewed.$.viewDate": new Date( doc.eventdata.Viewed[0].viewDate)         }}   ) }); 

or you can use this query

db.TRACKING_DATA.find().forEach(function(doc) { db.TRACKING_DATA.update({ "_id": doc._id ,"eventdata.Viewed.viewDate":doc.eventdata.Viewed[0].viewDate},         { "$set": {              "eventdata.Viewed.$.viewDate": new Date( doc.eventdata.Viewed[0].viewDate)         }}   ) });

Upvotes: 1

Related Questions