Сравнение 2 полей в запросе агрегации Монго

У меня есть коллекция в моей базе данных Монго под названием WorkOrder с 2 полями DateComplete а также DateDue, Используя эти 2 поля, я хотел бы использовать структуру агрегирования для подсчета количества «поздних» рабочих заданий путем сравнения двух полей. Однако исследование, которое я обнаружил, не имело каких-либо полезных способов отформатировать запрос так, чтобы «поздние» рабочие задания были отфильтрованы. Кто-нибудь знает способ форматирования запроса агрегации БД Mongo (желательно на PHP), который может сравнить 2 поля в коллекции?

РЕДАКТИРОВАТЬ:

Пример записи в WorkOrder может выглядеть так

_Я бы

какой-то монго

Дата возвращения

2014-10-10

DateCompleted

2014-10-12

Эта запись должна фильтроваться, так как DateCompleted больше DateDue. Я не знал об операторе $ cond, поэтому пока ничего не пробовал.

РЕДАКТИРОВАТЬ:

После попытки предложения @ BatScream с помощью следующего запроса в моем PHP-скрипте

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

Тем не менее MongoCollection::Aggregate функция сказала мне, что $cond не был признанным оператором.

РЕДАКТИРОВАТЬ: @ BatScream ответ, кажется, работает, но я не знал о том факте, что оператор группы не работает должным образом после применения $ проекта. Я надеялся, что смогу сгруппировать эти документы в другом поле cID, это возможно?

1

Решение

Приведенный ниже конвейер агрегации даст вам результат, учитывая, что ваши поля имеют 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"})
2

Другие решения

Других решений пока нет …