Mongo groupby在Laravel原始方法

时间:2017-08-08 12:54:36

标签: php mongodb laravel laravel-5 laravel-5.4

下面的代码是从mongoDB获取数据,并在日期范围(sum(prepayment_amount) and sum(total_prepayment_amount) group by checkin_from date)中绘制图表中金额和日期的总和。金额总和在y axis,日期在x axis

从这段代码我得到金额和日期的总和,但问题是,

查看日期和时间2017-10-05T19:07:17Z & 2017-10-05T00:00:00Z。在这种情况下(sum(prepayment_amount)sum(total_prepayment_amount)日期分别绘制。

如果日期和时间为2017-10-05T00:07:17Z & 2017-10-05T00:00:00Z。我得到了正确的结果。

我不知道问题出在哪里。我添加了例外结果。任何帮助,将不胜感激。感谢

Booking.php(型号)

protected $dates = ['bookingdate', 'checkin_from', 'reserve_to'];

DashbardController.php

public function show(Request $request)
    {
        if(!empty($request->cabin) && !empty($request->daterange))
        {
            $cabinName              = $request->cabin;
            $daterange              = explode("-", $request->daterange);
            /*$dateBegin              = new \MongoDB\BSON\UTCDateTime(strtotime($daterange[0])*1000);
            $dateEnd                = new \MongoDB\BSON\UTCDateTime(strtotime($daterange[1])*1000);*/
            $dateBegin              = new \MongoDB\BSON\UTCDateTime(new DateTime($daterange[0]));
            $dateEnd                = new \MongoDB\BSON\UTCDateTime(new DateTime($daterange[1]));
            $bookings               = Booking::raw(function ($collection) use ($cabinName, $dateBegin, $dateEnd) {
                return $collection->aggregate([
                    [
                        '$match' => [
                            'is_delete' => 0,
                            'cabinname' => $cabinName,
                            'checkin_from' => ['$gte' => $dateBegin, '$lte' => $dateEnd]
                        ],
                    ],
                    [
                        '$group' =>
                            [
                                '_id' => ['checkin_from' => '$checkin_from','cabinname' => '$cabinname'],
                                'total_prepayment_amount' => ['$sum' => '$total_prepayment_amount'],
                                'prepayment_amount' => ['$sum' => '$prepayment_amount'],
                            ],
                    ],
                    [
                        '$project' =>
                            [
                                'checkin_from' => '$_id.checkin_from',
                                'cabinname' => '$_id.cabinname',
                                'total_prepayment_amount' => 1,
                                'prepayment_amount' => 1
                            ],
                    ],
                    [
                        '$sort' =>
                            [
                                'checkin_from' => 1
                            ],
                    ],
                ]);
            });

            $totalPrepayAmount       = [];
            $prepayAmount            = [];
            $checkinFrom             = [];
            $serviceFee              = [];
            foreach ($bookings as $booking){
                if(!empty($booking->total_prepayment_amount) && !empty($booking->prepayment_amount)) {
                    $checkinFrom[]       = $booking->checkin_from->format('d.m.y');
                    $totalPrepayAmount[] = $booking->total_prepayment_amount;
                    $prepayAmount[]      = $booking->prepayment_amount;
                    $serviceFee[]        = round($booking->total_prepayment_amount - $booking->prepayment_amount, 2);
                }
            }

            $chartData[] =[
                'label'=> __("statisticsAdmin.totalPrepayAmount"),
                'backgroundColor' => 'rgba(255, 99, 132, 0.2)',
                'borderColor'=> 'rgba(255,99,132,1)',
                'borderWidth'=> 1,
                'data' => $totalPrepayAmount,
            ];

            $chartData[] =[
                'label'=> __("statisticsAdmin.prepayAmount"),
                'backgroundColor' => 'rgba(153, 102, 255, 0.2)',
                'borderColor'=> 'rgba(153, 102, 255, 1)',
                'borderWidth'=> 1,
                'data' => $prepayAmount,
            ];

            $chartData[] =[
                'label'=> __("statisticsAdmin.serviceFee"),
                'backgroundColor' => 'rgba(79, 196, 127, 0.2)',
                'borderColor'=> 'rgba(79, 196, 127, 1)',
                'borderWidth'=> 1,
                'data' => $serviceFee,
            ];

            return response()->json(['chartData' => $chartData, 'chartLabel' => $checkinFrom]);
        }


    }

预订系列

    { "_id" : ObjectId("58046a49f8f888a80b00002a"), "cabinname" : "Matras-Haus", "checkin_from" : ISODate("2016-09-17T00:00:00Z"), "prepayment_amount" : "20", "total_prepayment_amount" : "25", "bookingdate" : ISODate("2016-09-17T06:06:01Z"), "reservation_cancel" : "2", "is_delete" : NumberLong(1), "payment_status" : "1" }
    { "_id" : ObjectId("58183678d2ae67a404431d5c"), "cabinname" : "Kemptner Hütte", "checkin_from" : ISODate("2016-10-31T00:00:00Z"), "prepayment_amount" : "30", "total_prepayment_amount" : "40", "bookingdate" : ISODate("2016-11-01T06:30:16Z"), "reservation_cancel" : "2", "is_delete" : NumberLong(1), "payment_status" : "0" }
    { "_id" : ObjectId("581b31f3d2ae674d5f431d5b"), "cabinname" : "Kemptner Hütte", "checkin_from" : ISODate("2016-10-31T00:00:00Z"), "prepayment_amount" : "35", "total_prepayment_amount" : "45", "bookingdate" : ISODate("2016-11-03T12:47:47Z"), "reservation_cancel" : "2", "is_delete" : NumberLong(1) }
    { "_id" : ObjectId("5821af65d2ae67c82154efc5"), "cabinname" : "Kemptner Hütte", "checkin_from" : ISODate("2016-09-05T00:00:00Z"), "prepayment_amount" : "40", "total_prepayment_amount" : "45", "bookingdate" : ISODate("2016-11-08T10:56:37Z"), "reservation_cancel" : "2", "is_delete" : NumberLong(1) }
    { "_id" : ObjectId("582558d4d2ae679c4d8b4567"), "cabinname" : "Matras-Haus", "checkin_from" : ISODate("2016-09-17T00:00:00Z"), "prepayment_amount" : "20", "total_prepayment_amount" : "23", "bookingdate" : ISODate("2016-08-17T05:36:20Z"), "is_delete" : NumberLong(1) }
    { "_id" : ObjectId("58352c3cd2ae672341ec89e1"), "cabinname" : "Kemptner Hütte", "checkin_from" : ISODate("2016-09-05T00:00:00Z"), "prepayment_amount" : "50", "total_prepayment_amount" : "55", "bookingdate" : ISODate("2016-08-05T05:42:20Z"), "reservation_cancel" : "2", "is_delete" : NumberLong(1) }
    { "_id" : ObjectId("58352c3cd2ae672341ec887e1"), "cabinname" : "Kemptner Hütte", "checkin_from" : ISODate("2017-10-05T19:07:17Z"), "prepayment_amount" : "50", "total_prepayment_amount" : "55", "bookingdate" : ISODate("2017-08-05T05:42:20Z"), "reservation_cancel" : "2", "is_delete" : NumberLong(1) }
    { "_id" : ObjectId("58352c3cd2ae672341ec887e1"), "cabinname" : "Matras-Haus", "checkin_from" : ISODate("2017-10-05T00:00:00Z"), "prepayment_amount" : "50", "total_prepayment_amount" : "55", "bookingdate" : ISODate("2017-08-05T05:42:20Z"), "reservation_cancel" : "2", "is_delete" : NumberLong(1) }

期待结果

prepayment_amount total_prepayment_amount    checkin_from  cabinname

40                       48                  2016-09-17    Matras-Haus

50                       55                  2017-10-05   Matras-Haus

65                       85                  2016-10-31   Kemptner Hütte

90                       110                 2016-09-05   Kemptner Hütte

50                       55                  2017-10-05   Kemptner Hütte

图片

请检查图像,在这里你可以找到问题。为了更好地理解,我已经在x轴上列出了时间。

Note:In graph data not match with question data because I have connected database with test server.

enter image description here

2 个答案:

答案 0 :(得分:0)

$group中您直接使用$checkin_from作为时间日期,因此按日期和时间进行分组。

答案是使用$dateFormat,所以我们只有没有时间的日期:

'_id' => ['checkin_from' => ['$dateFormat' => ['date' => '$checkin_from', format => '%Y-%m-%d']], 'cabinname' => '$cabinname']

答案 1 :(得分:0)

您可以使用此组雄鹿,我将字符串转换为数字。根据提供的数据,total_prepayment_amountprepayment_amount是字符串   它们应为$sum的整数。

  [
    '$group' =>[
      '_id' => [
          'checkin_from' => '$checkin_from',
          'cabinname' => '$cabinname'
       ],
      'total_prepayment_amount' => [
           '$sum' => ['$toInt' => '$total_prepayment_amount']
       ],
      'prepayment_amount' => [
         '$sum' => ['$toInt' => '$prepayment_amount']
       ],
    ],
  ],

在查询mongodb时喜欢这样

total_prepayment_amount: {$sum : { $toInt: "$total_prepayment_amount"}},

请确保 mongodb ^ 4.0 (用于$ toInt)