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]}
}
}
]);
结果: