Я начинаю с Mongodb и php. В основном я пытаюсь получить данные из Mon go и использовать их для создания pdf, мы используем конвейеры агрегации, я сделал этот тест, который вычисляет км в день в Studio 3T, и он отлично работает:
db.getCollection("FrameGPS").aggregate(
// Pipeline
[
// Stage 1
{
$match: {
// enter query here
status: 'success',
deviceId: 100044,
$and: [
{'payload.fetchDate': { $gte: ISODate("2020-01-01T00:00:00.000+0200") }},
{'payload.fetchDate': { $lt: ISODate("2020-05-21T00:00:00.000+0200") }}
]
}
},
// Stage 2
{
$sort: {
'payload.fetchDate': 1
}
},
// Stage 3
{
$project: {
odometer: '$payload.odometer',
yearMonthDay: { $dateToString: { format: "%Y-%m-%d", date: "$payload.fetchDate" } }
}
},
// Stage 4
{
$group: {
_id: '$yearMonthDay',
min: { $min: "$odometer" },
max: { $max: "$odometer" }
}
},
// Stage 5
{
$project: {
// specifications
day: '$yearMonthDay',
km: {$floor: {$subtract: ['$max', '$min']}}
}
},
]);
Я использую https://github.com/doctrine/mongodb-odm, я пытался перевести это на это, и он работает, пока не дойдет до de $ project part:
$ builder = $ dm-> createAggregationBuilder ('App \ Document \ FrameGPS');
$builder
->match()
->field('status')->equals('success')
->field('deviceId')->equals($deviceId)
->field('payload.fetchDate')->gte($from)
->field('payload.fetchDate')->lt($to)
->sort(['payload.fetchDate' => 1])
->project()
->includeFields(['odometer','yearMonthDay'])
->field('odometer')->equals('$payload.odometer')
->field('yearMonthDay')->equals('$payload.fetchDate')
->group()
->field('_id')->equals('yearMonthDay')
->includeFields(['min','max'])
->field('min')->equals(min('$odometer'))
->field('max')->equals(max('$odometer'))
->project()
->includeFields(['day','km'])
->field('day')->equals('$yearMonthDay')
->field('day')->equals($floor($substract('$max','$min')));
Я искал документацию о том, как использовать $ project на php но ничего полезного не нашел.