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

如何在mongodb更新查询中运行多条件检查?,mongodb,mongodb-query,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-4a4bb1153e3

我有下面的场景。 我需要在一个更新查询中检查多个条件

样本数据:

"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}});
但它会插入新条目,因为上述条件需要三次检查


请为同样的问题提出解决方案。

如果将日期存储为字符串,会很尴尬。将日期存储为日期类型字段,这很简单:

> 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
操作符,因为用户将来不会访问该网站……希望如此。使用正确的日期还涉及另一个重要问题——今天的时区定义是什么?现在,对我来说,这是明天在澳大利亚…

谢谢你的建议,我将使用日期类型字段来存储日期,但它不符合我在第一篇文章中描述的第二个“如果条件”,因为如果用户今天已经访问过,那么它的“lastAccessDate”:todayDate。因此,当我们谈到第三个条件“lastAccessDate”:{$lt:todayDate},它会失败并向上插入新条目。如果文档中的
lastAccessDate
是今天,那么它就不是
$lt
今天,因此文档将不符合更新条件,也不会被更新。没有设置
upsert:true
选项,因此不会插入新文档。如果不设置upsert:true条件,那么我们可以为新访问者(第一次访问页面)处理条目。如果设置
upsert:true
,看起来一切都会很好。如果没有匹配的文档,它将插入一个新文档,其中包含给定的
会话ID
主机
,当前的
lastAccessedDate
,以及
计数
为1。我尝试了很多。。。你能不能给我一个有效的查询,,,因为我试了很多次,一次又一次地得到重复的条目。