如何在laravel MongoDB中使用groupBy Month和Sum

问题描述

查询获取每月订单(每月订单总数(计数)或每月总销售额(总和)): 试过这个查询,但它不起作用。还尝试了 StackOverflow 的其他结果,但我不明白它是如何使用 MongoDB 查询完成的。这是该问题的链接select-sum-column-and-group-by-with-mongodb-and-laravel

$monthly_orders = Order::select(
    DB::raw('sum(total_amount) as sum'),DB::raw('YEAR(created_at) year,MONTH(created_at) month'),)
->groupBy('month')
->get();

当我尝试通过使用 group by customer ID 来获取总金额时,它返回 sum 为 null

$monthly_orders = Order::selectRaw('sum(total_amount) as sum,customer_id')
    ->groupBy('customer_id')
    ->pluck('sum','customer_id');

结果:

Illuminate\Support\Collection {#2123 ▼
  #items: array:4 [▼
    "6098e5ff5977a25ee96a2a42" => null
    "60dbf87f7d8ffb7cdb2233d2" => null
    "605af409195d8e59e34893f2" => null
    "60ddae4a66fb69678e45f056" => null
  ]
}

解决方法

尝试使用 rawaggregate

$monthly_orders = Order::raw(function ($collection) {
        return $collection->aggregate([
            [
                '$group' => [
                    "_id" => '$customer_id','customer_id' => ['$first' => '$customer_id'],'sum' => ['$sum' => '$total_amount']
                ]
            ],]);
    });

你可以使用 pluck

$monthly_orders->pluck('sum','customer_id')

按月分组

 $monthly_orders = Order::raw(function ($collection) {
            return $collection->aggregate([
                [
                    '$group' => [
                       "_id" => ['$month'=>'$created_at'],'sum' => ['$sum' => '$total_amount']
                    ]
                ],]);
        });

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...