Php 比较Mongo聚合查询中的两个字段

Php 比较Mongo聚合查询中的两个字段,php,mongodb,aggregation-framework,Php,Mongodb,Aggregation Framework,我的Mongo数据库中有一个名为WorkOrder的集合,其中有两个字段DateComplete和DateDue。使用这两个字段,我想使用聚合框架通过比较这两个字段来计算“迟到”工单的数量。然而,我发现的研究没有任何有用的方法来格式化查询,以便过滤“迟到”的工单。有人知道一种格式化Mongo DB聚合查询(最好是PHP)的方法,可以比较集合中的两个字段吗 编辑: WorkOrder中的一个示例条目可能如下所示 _身份证 一些mongo id 到期日 2014-10-10 已完成日期 2014年1

我的Mongo数据库中有一个名为
WorkOrder
的集合,其中有两个字段
DateComplete
DateDue
。使用这两个字段,我想使用聚合框架通过比较这两个字段来计算“迟到”工单的数量。然而,我发现的研究没有任何有用的方法来格式化查询,以便过滤“迟到”的工单。有人知道一种格式化Mongo DB聚合查询(最好是PHP)的方法,可以比较集合中的两个字段吗

编辑:

WorkOrder中的一个示例条目可能如下所示

_身份证

一些mongo id

到期日

2014-10-10

已完成日期

2014年10月12日

由于DateCompleted大于DateDue,因此需要筛选此条目。我不知道$cond接线员的事,所以我还没试过

编辑:

在我的PHP脚本中使用以下查询尝试@BatScream的建议之后

array(
    '$cond' => array(
        'if' => array(
            'dateDue' => array(
                '$lt' => 'dateComplete
            )
        )
    )
)
但是,
MongoCollection::Aggregate
函数告诉我,
$cond
不是可识别的运算符


编辑:@BatScream的答案似乎有效,但我不知道在应用$project后,组操作符不能正常工作。我希望能够将这些文档分组到另一个字段
cID
,这可能吗?

考虑到您的字段属于
ISODate
类型,下面的聚合管道将为您提供结果。如果没有,我建议您将它们存储为
ISODate
类型和not字符串

db.collection.aggregate([
{$project:{"isLateWorkOrder":{$cond:[{$lt:["$dateDue","$dateCompleted"]},
                          true,false]}}},
{$match:{"isLateWorkOrder":true}},
{$group:{"_id":null,"lateWorkOrders":{$sum:1}}},
{$project:{"_id":0,"lateWorkOrders":1}}
])
PHP语法应该类似于

$projA = array("isLateWorkOrder" => 
                 array("$cond" => 
                             array(array("$lt" =>
           array("$dateDue","$dateCompleted")),
           true,false)))                         
$matchA = array("isLateWorkOrder"  => true)
$grp =  array("_id" => null,"lateWorkOrders" => array("$sum" => 1))
$projB = array("_id" => 0,"lateWorkOrders" => 1)

$pipeline = array($projA,$matchA,$grp,$projB);
$someCol -> aggregate($pipeline)
或者,只需使用
count
功能:

db.collection.count({$where:"this.dateDue < this.dateCompleted"})
db.collection.count({$where:“this.dateDue
您需要同时使用
$cond
$gt
运算符来投影新字段,并根据投影字段执行计算。请发布一些示例数据和您尝试过的内容。您能粘贴完整的管道和关于
$cond
的错误吗?它确实是一个真正的agg操作符,但它属于
$project
阶段,而不是
$match
阶段。这段代码主要起作用,只是PHP中任何带有$in的引号都应该是单引号,或者需要转义$in,以便PHP不会将其解释为变量。