Mongo - 发现日期不起作用

时间:2014-07-18 09:36:15

标签: mongodb

> db.samplecollection.find();
{
    "_id" : ObjectId("53c5ff4339c4473a278b46ca"),
    "start_time_mongo" : ISODate("2014-08-25T05:30:00Z"),
    "end_time_mongo" : ISODate("2014-08-25T06:30:00Z"),
}

以上收藏有一份文件。

我想在这个集合中搜索一些日期范围,如下面的2个例子。

Query1 :8月17日至8月18日之间的日期 - 使用javascript日期函数

答案:结果显示不在日期范围内的文件

> db.samplecollection.find({ $or: [ { start_time_mongo: { $lte: new Date("1407954599000") } }, { end_time_mongo: { $gte: new Date("1403029800000") } } ]},{start_time_mongo:1,end_time_mongo:1}).pretty();
{
    "_id" : ObjectId("53c5ff4339c4473a278b46ca"),
    "start_time_mongo" : ISODate("2014-08-25T05:30:00Z"),
    "end_time_mongo" : ISODate("2014-08-25T06:30:00Z")
}

Query2 :8月17日至18日期间给出的日期 - 使用javascript日期函数

答案:结果显示不在日期范围内的文件

> db.samplecollection.find({ $or: [ { start_time_mongo: { $lte: ISODate("2014-08-13T18:29:59Z") } }, { end_time_mongo: { $gte: ISODate("2014-06-17T18:30:00Z") } } ] }, {start_time_mongo:1,end_time_mongo:1}).pretty();
{
    "_id" : ObjectId("53c5ff4339c4473a278b46ca"),
    "start_time_mongo" : ISODate("2014-08-25T05:30:00Z"),
    "end_time_mongo" : ISODate("2014-08-25T06:30:00Z")
}
>

1 个答案:

答案 0 :(得分:1)

您对此$or的使用不正确。您似乎正在尝试执行“范围”查询以查找“日期”之间的日期。所以在这里你需要:

db.samplecollection.find(
    { 
        start_time_mongo: { $lte: new ISODate("2014-08-13T18:29:59Z") },
        end_time_mongo: { $gte: new ISODate("2014-06-17T18:30:00Z") } }
    }
    {start_time_mongo:1,end_time_mongo:1}
).pretty()

这是一个逻辑“和”,表示需要满足这两个日期条件,并且只返回满足这两个条件的文档。你也可能通常会这样做,所以日期是在“值”之间:

db.samplecollection.find(
    { 
        start_time_mongo: { $gte: new ISODate("2014-06-17T18:30:00Z") } },
        end_time_mongo: { $lte: new ISODate("2014-08-13T18:29:59Z") }
    }
    {start_time_mongo:1,end_time_mongo:1}
).pretty()

您发出的查询:

 db.sample.find(
     { 
         $or: [ 
             { start_time_mongo: { $lte: new ISODate("2014-08-13T18:29:59Z") } },
             { end_time_mongo: { $gte: new ISODate("2014-06-17T18:30:00Z") } } 
         ]
     }, 
     {start_time_mongo:1,end_time_mongo:1}
 ).pretty()

此处评估的内容是正确的,因为日期 大于第二个条件且评估为true。这就是 $or 所做的,并且当任一参数为真时返回。