mysql BETWEEN等效于MongoDB

时间:2014-07-07 06:58:30

标签: php mysql mongodb

在PHP& MongoDB,我试图读取特定日历和特定时期的所有事件实例。每个活动都有开始和结束日期。它们是mongodb中的MongoDate类型。

我使用以下条件从mongo获取事件。

$condition = array(
 'start_time'    => array('$gte'    =>  new MongoDate($start_day)), 
 'end_time'      => array('$lte'    => new MongoDate($end_day))
);

这是我的问题,我错过了开始日期为我的日期范围的事件。

例如 活动于 2014年7月1日开始 活动于 2014年7月10日

结束

我的mongo查询 - 给我7月5日至7月12日的活动

$condition = array(
  'start_time'    =>    array('$gte'    => '5-july-2014'), 
  'end_time'      =>    array('$lte'    => '12-july-2014')
);

当我运行上述事件时,不会返回。

欢迎任何建议?

在mysql中,BETWEEN帮助我获得所需的结果。

2 个答案:

答案 0 :(得分:3)

您的查询会选择在给定日期范围内完全包含的所有事件,但是当我理解正确时,您希望部分或完全重叠的事件日期范围

当A的开头位于B的结尾之前且A的结尾位于B的开始之后时,日期范围与另一个日期范围重叠。所以尝试

'event_start'    => array('$lte'    =>  new MongoDate($search_end)), 
'event_end'      => array('$gte'    => new MongoDate($search_start))

我应该提到的另一个陷阱是MongoDate并不代表一天,而是一个确切的时间点。当你省略时间时,你会在那个日期得到午夜。因此,'$lte' => '12-july-2014'为您提供了2014-04-12 0:00:00.000,它不会在7月12日在上选择。如果您想要包含当天,请手动设置12-july-2014 23:59:59之类的时间,或者只使用第二天。

答案 1 :(得分:1)

没有直接等同于“between”,但是使用这样的数据:

{
    "start_time" : ISODate("2014-07-01T00:00:00Z"),
    "end_time" : ISODate("2014-07-10T00:00:00Z")
}
{
    "start_time" : ISODate("2014-07-05T00:00:00Z"),
    "end_time" : ISODate("2014-07-12T00:00:00Z")
}
{
    "start_time" : ISODate("2014-07-07T00:00:00Z"),
    "end_time" : ISODate("2014-07-14T00:00:00Z")
}
{
    "start_time" : ISODate("2014-07-13T00:00:00Z"),
    "end_time" : ISODate("2014-07-14T00:00:00Z")
}

这有效:

db.collection.find(
    {
        "$or": [
            { "start_time": { 
                "$gte": new Date("2014-07-05"),
                "$lte": new Date("2014-07-12")
              }
            },
            { "end_time":   { 
                "$gte": new Date("2014-07-05"),
                "$lte": new Date("2014-07-12")
              } 
            }
        ]
    }
)

并产生:

{
    "start_time" : ISODate("2014-07-01T00:00:00Z"),
    "end_time" : ISODate("2014-07-10T00:00:00Z")
}
{
    "start_time" : ISODate("2014-07-05T00:00:00Z"),
    "end_time" : ISODate("2014-07-12T00:00:00Z")
}
{
    "start_time" : ISODate("2014-07-07T00:00:00Z"),
    "end_time" : ISODate("2014-07-14T00:00:00Z")
}

只有在“开始和结束之间”范围内的日期的项目。