laravel mongodb模型要怎么写分组聚合?

1. 运行环境

1). 当前使用的 Laravel 版本?

laravel5.5

2). 当前使用的 php/php-fpm 版本?

PHP 版本:7.4
php-fpm 版本:7.4

3). 当前系统

Ubuntu

4). 业务环境

开发环境

5). 相关软件版本

jenssegers/mongodb

2. 问题描述?

mysql这样写可以拿到canteen_name和count,但mongodb模型好像不支持,在Issues上搜索问题的回答都是通过写原生解决的,想问下有没有更好的办法

$total   = OrderModel::query()
                ->selectRaw('count(user_id)')
                ->where('pay_status', '1')
                ->where('date', $orderDate)
                ->whereIn('canteen_id', Arr::intToString($canteenIds))
                ->groupBy([
                    'canteen_name',
                ])
                ->orderBy('_id')
                ->get();

3. 您期望得到的结果?

order.aggregate([{
    "$match": {
        "pay_status": "1",
        "date": "2023-06-08",
        "canteen_id": {
            "$in": ["16"]
        }
    }
}, {
    "$group": {
        "_id": "$canteen_name",
        "count": {
            "$sum": 1
        }
    }
}, {
    "$sort": {
        "_id": 1
    }
}])

4. 您实际得到的结果?

下面是通过打印得出的执行语句

order.aggregate([{
    "$match": {
        "$and": [{
            "pay_status": "1"
        }, {
            "date": "2023-06-07"
        }, {
            "canteen_id": {
                "$in": ["16"]
            }
        }]
    }
}, {
    "$group": {
        "_id": {
            "canteen_name": "$canteen_name"
        },
        "canteen_name": {
            "$last": "$canteen_name"
        },
        "count(user_id)": {
            "$last": "$count(user_id)"
        }
    }
}, {
    "$sort": {
        "_id": 1
    }
}], {
    "typeMap": {
        "root": "array",
        "document": "array"
    }
})
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 2
sanders

我们是直接用 mongodb 管道的方式组成表达式进行聚合查询的。

10个月前 评论
silie (楼主) 10个月前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!