在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帮助我获得所需的结果。
答案 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")
}
只有在“开始和结束之间”范围内的日期的项目。