Laravel MongoDB 中实现按小时分组并动态聚合各分类价格总和
发布时间 - 2026-01-28 00:00:00 点击率:次本文详解如何在 laravel + mongodb 环境中,使用聚合管道(aggregation pipeline)对 `created_at` 字段按小时截断分组,同时按 `category` 动态键名(如 "category a total price")汇总价格,并将结果扁平化为单行结构。
在 Laravel 项目中集成 MongoDB(常用 jenssegers/mongodb 包)时,若需实现「按时间粒度分组 + 按分类动态键名聚合」的复杂报表需求(如每小时各商品类目销售额汇总),原生 Eloquent 不支持动态字段名聚合,必须借助 MongoDB 原生聚合管道(aggregate())完成。
以下聚合流程精准匹配你的目标输出格式:
✅ 按 created_at 截断到小时级(非天级;原文示例中 unit: "day" 应修正为 "hour")
✅ 先按 category + hour 两级分组求和
✅ 再次分组,将各分类汇总结果转为键值对数组(k/v 形式)
✅ 使用 $arrayToObject 动态生成字段,再通过 $mergeObjects 合并 created_at 字段
✅ 正确聚合管道(Laravel 调用示例)
use Jenssegers\Mongodb\Collection;
$collection = (new YourModel)->getCollection(); // 获取原生 Collection 实例
$result = $collection->aggregate([
[
'$match' => [
// 可选:添加时间范围等过滤条件,如 'created_at' => ['$gte' => '2025-02-01']

]
],
[
'$group' => [
'_id' => [
'category' => '$category',
'hour' => [
'$dateTrunc' => [
'date' => ['$toDate' => '$created_at'],
'unit' => 'hour', // ⚠️ 关键:改为 'hour' 实现小时级分组
]
]
],
'total' => ['$sum' => '$price']
]
],
[
'$group' => [
'_id' => '$_id.hour',
'entries' => [
'$push' => [
'k' => ['$concat' => ['$_id.category', ' Total Price']],
'v' => '$total'
]
]
]
],
[
'$replaceWith' => [
'$mergeObjects' => [
['$arrayToObject' => '$entries'],
['created_at' => '$_id']
]
]
]
])->toArray();? 输出结构说明
执行后将得到类似如下文档(注意:created_at 已被截断为小时精度,如 "2025-02-01T01:00:00Z"):
{
"Category A Total Price": 100,
"Category B Total Price": 350,
"created_at": "2025-02-01T01:00:00.000Z"
}⚠️ 注意事项与最佳实践
- 时间字段类型:确保 created_at 在 MongoDB 中为字符串格式(如 "2025-02-01 01:05:00")。若已是 Date 类型,可省略 $toDate 转换。
- Laravel 版本兼容性:$dateTrunc 需 MongoDB ≥ 5.0;低版本请改用 $dateFromParts 或 $substr 手动截取(不推荐)。
-
性能优化:在 created_at 和 category 字段上创建复合索引:
db.collection.createIndex({ "created_at": 1, "category": 1 }) -
空值防护:生产环境建议在 $match 阶段排除 null/空字符串的 category 或 price,避免聚合异常:
'$match' => [ 'category' => ['$ne' => null], 'price' => ['$ne' => null, '$type' => 'number'] ]
该方案无需为每个分类编写独立查询,也无需 PHP 层手动合并,完全由数据库高效完成动态透视聚合,兼顾可读性与执行性能。
# php
# laravel
# go
# mongodb
# 键值对
# gate
# NULL
# date
# 字符串
# 数据库
# 性能优化
# 键名
# 已被
# 并将
# 已是
# 添加时间
# 不支持
# 可选
# 后将
# 每小时
# 两级
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何注册花生壳免费域名并搭建个人网站?
Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案
详解Android图表 MPAndroidChart折线图
手机软键盘弹出时影响布局的解决方法
韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南
如何快速搭建高效可靠的建站解决方案?
Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南
Laravel怎么生成URL_Laravel路由命名与URL生成函数详解
成都网站制作公司哪家好,四川省职工服务网是做什么用?
Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程
Laravel如何保护应用免受CSRF攻击?(原理和示例)
Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解
Laravel如何实现模型的全局作用域?(Global Scope示例)
如何在云服务器上快速搭建个人网站?
Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】
HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】
浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】
黑客如何利用漏洞与弱口令入侵网站服务器?
如何用腾讯建站主机快速创建免费网站?
Laravel如何与Pusher实现实时通信?(WebSocket示例)
php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】
如何用美橙互联一键搭建多站合一网站?
如何在宝塔面板中创建新站点?
Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知
javascript事件捕获机制【深入分析IE和DOM中的事件模型】
零基础网站服务器架设实战:轻量应用与域名解析配置指南
Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲
Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
如何用AI帮你把自己的生活经历写成一个有趣的故事?
如何快速生成可下载的建站源码工具?
php485函数参数是什么意思_php485各参数详细说明【介绍】
昵图网官网入口 昵图网素材平台官方入口
如何在万网自助建站平台快速创建网站?
韩国服务器如何优化跨境访问实现高效连接?
宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程
如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】
再谈Python中的字符串与字符编码(推荐)
Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】
武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?
Laravel如何使用.env文件管理环境变量?(最佳实践)
香港网站服务器数量如何影响SEO优化效果?
Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】
JS去除重复并统计数量的实现方法
Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决
如何在Windows服务器上快速搭建网站?
微信小程序 canvas开发实例及注意事项
Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】
PythonWeb开发入门教程_Flask快速构建Web应用
如何在云主机快速搭建网站站点?


