MongoDB聚合管道与$Lookup查询问题求助及修正指导
MongoDB Aggregate 查询实现指南(Accessories数据库)
Query1:查找从未售出的产品
直接通过$lookup关联售出记录,过滤无售出记录的产品:
db.Products.aggregate([ { $lookup: { from: "ProductSold", localField: "_id", foreignField: "productId", as: "soldRecords" } }, { $match: { soldRecords: { $size: 0 } } }, { $project: { _id: 1, productName: 1 // 按需保留其他产品字段 } } ])
注意:如果之前结果异常,先检查关联字段是否匹配(比如是否误用productName而非_id),确认ProductSold中productId类型和Products._id一致。
Query2:未售产品库存统计排序
基于未售产品筛选结果,关联库存并统计排序:
db.Products.aggregate([ // 先筛未售产品 { $lookup: { from: "ProductSold", localField: "_id", foreignField: "productId", as: "soldRecords" } }, { $match: { soldRecords: { $size: 0 } } }, // 关联库存数据 { $lookup: { from: "ProductStock", localField: "_id", foreignField: "productId", as: "stockInfo" } }, // 计算总库存(兼容无库存的产品) { $addFields: { totalStock: { $sum: { $ifNull: ["$stockInfo.stockQuantity", 0] } } } }, // 按库存降序排序 { $sort: { totalStock: -1 } }, { $project: { _id: 1, productName: 1, totalStock: 1 } } ])
注意:如果结果条数不对,检查ProductStock中是否存在未关联到产品的无效数据,或者是否漏处理无库存的未售产品。
Query3:去重国家-仓库组合
从库存集合中提取唯一的国家-仓库配对:
db.ProductStock.aggregate([ { $group: { _id: { country: "$country", warehouse: "$warehouse" } } }, { $project: { _id: 0, country: "$_id.country", warehouse: "$_id.warehouse" } } ])
通过$group按组合字段聚合自动去重,最后整理输出格式。
Query4:各仓库产品数量统计
统计每个仓库的产品种类数(非库存总量):
db.ProductStock.aggregate([ { $group: { _id: { warehouse: "$warehouse", country: "$country" // 不需要按国家区分可删除此行 }, uniqueProducts: { $addToSet: "$productId" } } }, { $addFields: { productCount: { $size: "$uniqueProducts" } } }, { $project: { _id: 0, warehouse: "$_id.warehouse", country: "$_id.country", // 对应上面的删除操作调整 productCount: 1 } }, { $sort: { productCount: -1 } } ])
如果要统计库存总量,把$addToSet替换为$sum: "$stockQuantity"即可。
内容的提问来源于stack exchange,提问作者mobly elliot
相关产品推荐
相关产品推荐

