我的Mongo数据库中有一个名为WorkOrder
的集合,包含2个字段DateComplete
和DateDue
。使用这两个字段,我想使用聚合框架通过比较两个字段来计算“延迟”工作订单的数量。然而,我发现的研究没有任何有用的方法来格式化查询,以便过滤“延迟”工作订单。有没有人知道格式化Mongo DB聚合查询(最好是PHP)的方法,可以比较集合中的2个字段?
编辑:
WorkOrder中的示例条目可能类似于
_id
一些mongo id
DateDue
2014年10月
DateCompleted
2014年10月12日
由于DateCompleted大于DateDue,因此需要对此条目进行过滤。我不知道$ cond运算符,所以我还没有尝试过任何东西。
编辑:
在PHP脚本中使用以下查询尝试@ BatScream的建议
array(
'$cond' => array(
'if' => array(
'dateDue' => array(
'$lt' => 'dateComplete
)
)
)
)
但MongoCollection::Aggregate
函数告诉我$cond
不是公认的运算符。
cID
,这可能吗?
答案 0 :(得分:2)
考虑到您的字段属于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"})