如何在mongodb更新查询中运行多条件检查?

时间:2014-08-25 17:00:55

标签: mongodb mongodb-query

我有以下情况。 我需要在单个更新查询中检查多个条件。

示例数据:

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

这是我的要求:

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});
}
}

我需要在单个查询中执行上述操作,但我有GB的数据。 我在上面尝试过如下:

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

但它会插入新条目,因为上述条件需要三次检查。

请为此建议解决方案。

1 个答案:

答案 0 :(得分:1)

如果您将日期存储为字符串,那就太尴尬了。将日期存储为日期类型字段,这很容易:

> 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
}

我使用$lt运算符进行日期测试,因为用户将来无法访问该网站...希望如此。使用正确的日期也是另一个重要问题 - 今天时区定义了什么?现在,对我而言,明天在澳大利亚......