Mongoose聚合查询:筛选指定店铺库存大于0的Item
解决方案
你需要在原有的聚合管道中,给$filter的条件加上指定城市下库存总和大于0的判断,通过嵌套数组操作计算库存总和即可实现需求。以下是修改后的完整代码:
const targetShop = 'Ice cream Shop'; const targetCity = 'NY'; const nameRegex = /.*Straw.*/; const items = await Shop.aggregate() .match({ shopName: targetShop }) .project({ items: { $filter: { input: "$items", as: "item", cond: { $and: [ // 保留原有的itemName正则匹配条件 { $regexMatch: { input: "$$item.itemName", regex: nameRegex } }, // 新增:计算指定城市下所有arrivals的quantityLeft总和并判断是否大于0 { $gt: [ { $sum: { $map: { // 先筛选出当前item中属于目标城市的availabilities条目 input: { $filter: { input: "$$item.availabilities", as: "avail", cond: { $eq: ["$$avail.city", targetCity] } } }, as: "filteredAvail", // 对每个符合条件的availabilities,计算其arrivals的quantityLeft总和 in: { $sum: "$$filteredAvail.arrivals.quantityLeft" } } } }, 0 ] } ] } } } });
关键逻辑说明
- 筛选指定城市的库存条目:通过
$filter从item的availabilities数组中挑出city匹配目标城市的项 - 计算库存总和:用
$map遍历筛选后的availabilities,对每个项的arrivals.quantityLeft求和,再用外层的$sum把所有availabilities的库存加总 - 多条件筛选:用
$and同时满足「itemName正则匹配」和「库存总和>0」两个条件,最终得到符合要求的Item数组
内容的提问来源于stack exchange,提问作者AnimateMe
相关产品推荐
相关产品推荐

