deepesh17feb
deepesh17feb

Reputation: 87

How to run multi condition check in mongodb update query?

I have the following scenario. I need to check multiple condition in a single update query.

Sample Data :

"host" : "zigwheels.com",
"lastAccessDate" : "20140819",
"sessionId" : "ff8378ed-ccda-4a75-b24b-4a4bb1153e39"

Here is my requirement :

obj=db.userFrequency.find({"host" : "xyz.com", "sessionId" : "ff8378ed-ccda-4a75-b24b-4a4bb1153e39"});
if(obj!=null){
   if(obj.get("lastAccessDate")!= todayDate){
     //If page has not visited today, increment count by 1 and update "lastAccessDate"=todayDate
     db.userFrequency.update({"host" : "xyz.com","sessionId" : "ff8378ed-ccda-4a75-b24b-4a4bb1153e39"},{$set : {"lastAccessDate"=todayDate},$inc : {"count":1}});
   }
   else{
      // If page visited today{lastAccessDate==todayDate}, no need to update count
   } 

}else{
    //Insert the new Entry  
    db.userFrequency.update({"host" : "xyz.com","sessionId" : "ff8378ed-ccda-4a75-b24b-4a4bb1153e39"},{$set : {"lastAccessDate"=todayDate},$inc : {"count":1}},{upsert:true});
}

I need to do the above operation in a single query but I have GB's of data. I tried above like below :

db.userFrequency.update({"host" : "xyz.com","lastAccessDate"!=todayDate,"sessionId" : "ff8378ed-ccda-4a75-b24b-4a4bb1153e39"},{$set : {"lastAccessDate"=todayDate},$inc : {"count":1}});

but it inserts new entry because the above condition requires three checks.

Please suggest a solution for the same.

Upvotes: 0

Views: 16181

Answers (1)

wdberkeley
wdberkeley

Reputation: 11671

It's awkward if you store your date as a string. Store dates as date type fields and this is easy:

> db.userFrequency.insert({
    "host" : "zigwheels.com",
    "lastAccessDate" : ISODate("2014-08-19"),
    "sessionId" : "ff8378ed-ccda-4a75-b24b-4a4bb1153e39"
})
> var today = ISODate("2014-08-25")
> db.userFrequency.update({
    "host" : "zigwheels.com",
    "lastAccessDate" : { "$lt" : today },
    "sessionId" : "ff8378ed-ccda-4a75-b24b-4a4bb1153e39"
},
{
    $set : { "lastAccessDate" : today},
    $inc : { "count" : 1 }
})
> db.userFrequency.findOne()
{
    "_id" : ObjectId("53fbd08...398"),
    "host" : "zigwheels.com",
    "lastAccessDate" : ISODate("2014-08-25T00:00:00Z"),
    "sessionId" : "ff8378ed-ccda-4a75-b24b-4a4bb1153e39",
    "count" : 1
}

I used the $lt operator for the date test because users won't access the website from the future...hopefully. Using proper dates also surfaces another important issue- what timezone defines today? Right now, for me, it's tomorrow in Australia...

Upvotes: 2

Related Questions