MongoDB如何将数组匹配项提升至顶层并返回对应查询结果
MongoDB聚合查询实现方案
你可以通过以下4步聚合管道实现需求:
- 先过滤包含目标sku的订单文档,降低后续计算量
- 拆分inventory数组为独立条目
- 筛选出sku匹配的条目
- 重构输出字段为你需要的格式
完整查询代码如下:
db.salesOrder.aggregate([ // 第一步:过滤出inventory中至少有一个sku为i3的订单文档 { $match: { "inventory.sku": "i3" } }, // 第二步:拆分inventory数组,每个元素对应一条独立文档 { $unwind: "$inventory" }, // 第三步:筛选出拆分后sku为i3的条目 { $match: { "inventory.sku": "i3" } }, // 第四步:调整输出字段格式,得到你需要的结构 { $project: { _id: 0, salesOrderRef: 1, customerRef: 1, sku: "$inventory.sku", quantity: "$inventory.quantity", priceEa: "$inventory.priceEa", discount: "$inventory.discount" } } ])
效果说明
- 如果单个订单的inventory数组里有多个i3的条目,
$unwind会把每个条目都拆成独立文档,后续筛选后会分别返回,完全符合你要求的多结果输出场景 - 第一步的预过滤可以跳过没有目标sku的订单,大幅提升大数量集合下的查询效率
内容的提问来源于stack exchange,提问作者how2code
相关产品推荐
相关产品推荐

