mongodb嵌套聚合

复制代码
db.order.aggregate([
    {
        $match: {
				// 下单时间
				 "createTime": {
                $gte: ISODate("2024-05-01T00:00:00Z"),
                $lte: ISODate("2024-05-31T23:59:59Z")
            }
						// 商品名称
						,
            "goods.productName": /美国皓齿/
						,//订单状态  2:待发货 3:已发货 4:交易成功
						 "status": { $in: [2, 3, 4] }
        }
    }
		,
    {
			// 将订单集合中的商品数组拆开单个商品
        $unwind: "$goods"
    },
//    // Match goods with productName containing "美国皓齿"
    {
			// 再次过滤商品名称中包含美国皓齿的商品
        $match: {
            "goods.productName": /美国皓齿/
        }
    },
    {
        $group: {
            _id: 
							{
								// 根据订单编号进行分组统计
								orderNo:"$orderNo"
								//,uniformCode:"$goods.uniformCode" 多分组直接再加个字段即可,这个例子不需要
							},
							// 根据订单编号分组算出美国皓齿的商品数量乘单价满499的订单
            totalGoodsPrice: {
                $sum: {
                    $multiply: ["$goods.amount", "$goods.unitPrice"]
                }
            },
						// 获取商品数组
						goods:{$push:"$goods"},
						// 获取发货地址
						area:{ $push: "$address.area" }
//						orderStatus:{$push:"$status"}		
        }
    },
    {
				// 过滤单价满499的订单
        $match: {
            totalGoodsPrice: { $gte: 499 }
        }
    },
				// 将按照订单分组后的数组再次按照商品拆开
		    {
        $unwind: "$goods"
    },
			// 按照订单号排序
		  { $sort : { orderNo : 1}},
		{
			        $project: {
            _id: 0,
            订单号: "$_id.orderNo",
						uniformCode: "$goods.uniformCode",
            商品名称:  "$goods.productName",
            规格: "$goods.standard",
            单价: "$goods.unitPrice",
            数量: "$goods.amount",
//						总价:"$totalGoodsPrice",
						// 发货地址area是个数组,没有拆开,同一个订单的发货地址相同,取数组的第一个元素
						发货地区:{$arrayElemAt: ["$area", 0]}
        }
    }

]);

结果:

相关推荐
花间相见1 分钟前
【Ubuntu实用工具】—— Fcitx5 输入法安装与完整配置指南(新手友好+避坑版)
linux·数据库·ubuntu
数据知道5 分钟前
MongoDB 比较查询运算符:$gt, $lt, $ne, $in 在范围筛选中的实战应用
数据库·mongodb
德彪稳坐倒骑驴5 分钟前
数仓中的数据建模方法
数据库·oracle
青衫码上行7 分钟前
高频SQL 50题 | 聚合
数据库·sql·mysql·leetcode·面试
有点心急102112 分钟前
SQL 执行 MCP 工具开发(二)
数据库·sql
闲人编程37 分钟前
时序数据库InfluxDB应用
数据库·struts·时序数据库·innodb·时间戳·存储引擎·时间维度
杨云龙UP37 分钟前
Oracle ASM归档日志自动清理:RMAN+crontab一键闭环(生产可用)
linux·运维·服务器·数据库·oracle·centos·ux
数据知道38 分钟前
MongoDB 逻辑查询运算符:$and, $or, $nor, $not 构建复杂逻辑组合
数据库·mongodb
m0_5287490040 分钟前
复杂一点的sql查询
数据库·sql
崎岖Qiu1 小时前
Redis Set 实战:基于「并、差、交集」的分布式场景应用
数据库·redis·分布式·后端