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