2016-04-22 127 views
0

我想在MonoDB中使用聚合框架减去两个日期。在蒙戈减去日期

我的代码如下所示:

$ops = array(
    array('$project' => array("fieldMath" => 
    array('$subtract' => array('new ISODate()', 'new ISODate("last_interacted_date")')), 

    )), 
    array('$match' => array('fieldMath' => array('$gte' => 2), 
    ), 
    ), 
); 
$object -> aggregate($ops); 

的问题是我收到我想2。减去字符串错误。

Fatal error: Uncaught exception 'MongoResultException' with message 'localhost:27017: cant $subtract aString from a String

new ISODatelast_interacted_date都是ISODate对象。

我的目标是从今天的日期减去'last_did_something'日期,并返回2天内所有查询的结果。

我在做什么错,我该如何减去日期?

+0

你可以准确地确定你想通过包括一些样本文件和预期的输出实现什么? – chridam

+0

添加上面,基本上我想要所有的结果,其中当天扣除的日期大于2天。 –

+0

您应该计算查询的“外部”日期。你只需要定期查询,而不需要聚合。你当然这在PHP中。这不是JavaScript,而是BSON。所以你让司机做翻译。 –

回答

1

由于您想要查询日期字段大于或等于两天前的日期字段的文档,您需要创建一个新的日期对象(2天前的日期),您可以将其用作查询比较。下面演示了这一点:

$start = new MongoDate(strtotime("-2 days")); 
$ops = array(
    array("$match" => array(
     "last_interacted_date" => array("$gte" => $start) 
     ) 
    )  
); 
$object -> aggregate($ops); 

你可以用一记漂亮的图书馆叫做Carbon,可以帮助处理日期/时间在PHP更容易和更语义,使你的代码可以变得更具可读性和可维护性:

// get the current time 
$current = Carbon::now(); 

// subtract 2 days to the current time 
$start = $current->subDays(2); 

$ops = array(
    array("$match" => array(
     "last_interacted_date" => array("$gte" => $start) 
     ) 
    )  
); 
$object -> aggregate($ops); 
+0

你的答案几乎适用于我,但我需要天数,因为我需要将它与另一个变量进行比较。 –