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]} } } ]);
结果:
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。