TP5 Mongo聚合查询multiAggregate(Mysql的groupBy)

查询方式1:

$cmd = new \MongoDB\Driver\Command([
    'aggregate' => 'orders',//此处不能为test.orders
    'pipeline'  => [
        [
            '$match' => $where,
        ],
        [
            '$group' => [
                '_id'          => '$pay_type',
                'total_amount' => ['$sum' => '$pay_amount'],
            ],
        ],
    ],
]);
$res = $this->orderMongo->command($cmd);

说明:

pay_type:用来分组的field

pay_amount:汇总的数据字段

orders:collectionName

$where: 条件数组,如['pay_status'=>1,'type'=>3]


对应的Mysql语句为:

select sum(pay_amount) from orders where pay_status=1 and type=3 group by pay_type


查询方式2:


$res = $this->orderMongo
            ->table($tableName)
            ->where($where)
            ->multiAggregate(['sum' => 'pay_amount'],['pay_type']);

附OrderMongo代码:


<?php
      
namespace app\erp\model\mongo;
      
use thinkModel;
      
class OrdersMongo extends Model{
    protected $table = 'orders';//此处不能为test.orders
}




遇到的坑:

(1)查询方式1,match必须放在group前面,放在后面没有数据;

(2)查询方式2,这里的table不能包含数据库名,如数据库为test,要读的collection为orders,则model中的table需配置为“orders”,而不能是"test.orders",否则读取不到数据。

(3)查询方式1,aggregate对应的collectionName不能包含数据库名


by 雪洁 2020-08-27 10:16:18 657 views
我来说几句

相关文章