Запрос с диапазоном дат работает, когда выполняется непосредственно в Mongo, но не выполняется при использовании из Laravel
- У меня есть две коллекции под названием
promotions
а такжеcoupons
- Купоны имеет
promotion._id
как ссылка на рекламную коллекцию.
Я хочу получить рекламные акции в диапазоне дат. Для этого у меня есть два поля valid_from
а также apply_till
,
"valid_from" : ISODate("2018-09-10T06:15:02.000Z"),
"apply_till" : ISODate("2018-10-20T06:15:02.000Z")
Этот прямой запрос MongoDb работает, когда выполняется напрямую:
db.getCollection('coupons').aggregate([
{"$match":{"code":"PYDY25"}},
{"$lookup":{"from":"promotions","localField":"promotion_id","foreignField":"_id","as":"promotion"}},
{"$match":{
"promotion.valid_from":{"$lte": ISODate("2018-09-12 06:31:30")},
"promotion.apply_till":{"$gt": ISODate("2018-09-12 06:31:30")}
}
},
{"$project":{"_id":0,"code":1,"promotion":1}}
])
Однако, когда я пытаюсь сделать то же самое через Laravel, это не работает. В запросе, сгенерированном Laravel, отсутствует форматирование ISODate (предоставлен сгенерированный запрос ниже).
В Ларавеле:
Модель продвижения имеет:
protected $dates = [
'valid_from',
'valid_till',
'apply_till',
'created_at',
'updated_at'
];
Необработанный запрос, используемый для агрегирования в Laravel:
// Filter for code.
$aggregateBy[] = [
'$match' => [
'code' => $coupon->code
]
];
// JOINing table (promotion) for coupon table.
$aggregateBy[] = [
'$lookup' => [
'from' => 'promotions',
'localField' => 'promotion_id',
'foreignField' => '_id',
'as' => 'promotion'
]
];
$aggregateBy[] = [
'$unwind' => '$promotion'
];
$currentTime = Carbon::now()->format('Y-m-d\TH:i:s');
//$currentTime = new UTCDateTime((new \DateTime($currentTime))->getTimestamp());
$aggregateBy[] = [
'$match' => [
'promotion.valid_from' => [
'$lte' => $currentTime,
],
'promotion.apply_till' => [
'$gt' => $currentTime,
]
]
];
// SELECT ed fields.
$aggregateBy[] = [
'$project' => [
'_id' => 0,
'code' => 1,
'promotion' => 1,
]
];
\DB::connection('mongodb')->enableQueryLog();
$couponPromotion = Coupon::raw(function ($collection) use ($aggregateBy) {
return $collection->aggregate($aggregateBy);
});
\Log::info(\DB::connection('mongodb')->getQueryLog());
Когда я добавлю $match
условие для promotion.valid_from
и / или promotion.apply_till
это не дает результата. Моя переменная $currentTime
работает в Model::where()
условия, но не работает здесь.
В журнале запрос сгенерирован как:
db.getCollection('coupons').aggregate([
{"$match":{"code":"PYDY25"}},
{"$lookup":{"from":"promotions","localField":"promotion_id","foreignField":"_id","as":"promotion"}},
{"$match":{
"promotion.valid_from":{"$lte":"2018-09-12 06:31:30"},
"promotion.apply_till":{"$gt":"2018-09-12 06:31:30"}}
},
{"$project":{"_id":0,"code":1,"promotion":1}}
])
Как я могу пройти ISODate
на сгенерированный запрос?