2011-09-24 69 views
6

我想查询一个集合并获取创建不到3个小时前的文档。如何在PHP中使用MongoDB查询时间?

$realtime = date("Y-m-d H:i:s"); 
$mongotime = New Mongodate(strtotime($realtime)); 

$mongotime = $mongotime - 3 hours; //PSEUDOCODE 
$some_condition = array('time' => array('$lt'=>$mongotime)); 

$result = $db->collection->find($some_condition); 

有没有把

$ some_condition

部分,而不在PHP中使用IF语句的有效途径?

+0

我没有看到任何if语句在你的代码中......这真的是你的代码的样子吗? – dcrosta

+1

我认为你也有错误的顺序。 '$ lt'从左到右读,所以你想要PHP的等价物'{time:{$ lt:mongotime}}',这将是'array('time'=> array('$ lt'=> $ mongotime ))' – dcrosta

+0

@drcosta不,这只是我想要做的伪代码。而不是使用Find(),从查询结果中获取值并通过该值确定条件,我想在不使用任何If语句的情况下马上得到符合条件的结果。 – InspiredJW

回答

9

我找到了解决方案。

$diff = 60 * 60 * 3; //3 hours in seconds 

$mongotime = New Mongodate(time()-$diff); 

$condition = array('time' => array('$lt'=>$mongotime)); 

$result = $db->collection->find($condition); 
+4

你对'$ realtime'的计算是浪费的,你可以做'$ mongotime = new MongoDate(time() - $ diff);' – salathe

+0

对于最新的php版本,Mongodate类已被弃用。你能举出最新的PHP版本的例子吗? –

1

首先得到现在三小时前的时间。然后查询比一次更大:

define('SECONDS_PER_HOUR', 3600); 

$mongotime = New Mongodate(time()-3*SECONDS_PER_HOUR); 

$condition = array('time' => array('$lt'=>$mongotime)); 

$result = $db->collection->find($condition); 

有没有必要做一些标记 - >字符串 - >时间戳转换(如你所说的话),你应该命名你使用所以很明显,他们代表什么的常量。