Перевести агрегацию Mongodb в php - PullRequest
0 голосов
/ 17 июня 2020

Я начинаю с 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 но ничего полезного не нашел.

...