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


Comparing 2 fields within a Mongo Aggregation Query

我的 Mongo 数据库中有一个名为 WorkOrder 的集合,其中包含 2 个字段DateCompleteDateDue。使用这两个字段,我想使用聚合框架通过比较两个字段来计算"延迟"工作订单的数量。但是,我发现的研究没有任何有用的方法来格式化查询,以便过滤"延迟"工作订单。有谁知道一种方法来格式化可以比较集合中的 2 个字段的 Mongo DB 聚合查询(最好是 PHP(?

编辑:

工作订单中的示例条目可能如下所示

_id

一些蒙戈身份证

到期日

2014年10月10日

完成日期

2014年10月12

此条目需要筛选,因为完成日期大于到期日期。我不知道$cond运算符,所以我还没有尝试过任何东西。

编辑:

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

array(
    '$cond' => array(
        'if' => array(
            'dateDue' => array(
                '$lt' => 'dateComplete
            )
        )
    )
)

但是,MongoCollection::Aggregate函数告诉我,$cond不是一个公认的运算符。

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

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

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"})