You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MongoDB查询:仅返回嵌套数组中的匹配元素

MongoDB 查询:筛选含指定数组元素的文档并仅保留匹配项

你现有如下结构的MongoDB数据:

[
  { item: "journal", instock: [ { warehouse: "A", qty: 5 }, { warehouse: "C", qty: 15 } ] },
  { item: "notebook", instock: [ { warehouse: "C", qty: 5 } ] },
  { item: "paper", instock: [ { warehouse: "A", qty: 60 }, { warehouse: "G", qty: 15 } ] },
  { item: "planner", instock: [ { warehouse: "A", qty: 40 }, { warehouse: "B", qty: 5 } ] },
  { item: "postcard", instock: [ { warehouse: "B", qty: 15 }, { warehouse: "G", qty: 35 } ] }
]

需要筛选出所有instock数组中包含warehouse: "G"的文档,并且返回结果里的instock数组仅保留匹配该条件的元素。当前用db.collection_name.find({"instock.warehouse":"G"})能筛选出目标文档,但会返回整个instock数组,不符合需求。

方法1:使用find结合$elemMatch投影(单匹配项场景)

如果每个符合条件的文档中instock数组只有一个warehouse: "G"的元素,可以用$elemMatch在投影阶段只返回匹配的数组项:

db.collection_name.find(
  {"instock.warehouse": "G"},
  {"item": 1, "instock": {$elemMatch: {"warehouse": "G"}}}
)

注意:$elemMatch在投影中只会返回数组里第一个匹配的元素,若数组中有多个符合条件的项,该方法无法全部返回。

方法2:使用聚合管道(通用场景,支持多匹配项)

如果需要保留数组中所有匹配的元素,推荐使用聚合管道,先筛选文档,再过滤数组:

db.collection_name.aggregate([
  // 筛选包含warehouse:G的文档
  {$match: {"instock.warehouse": "G"}},
  // 过滤instock数组,仅保留warehouse为G的元素
  {$project: {
    item: 1,
    instock: {
      $filter: {
        input: "$instock",
        as: "stock",
        cond: {$eq: ["$$stock.warehouse", "G"]}
      }
    }
  }}
])

这个方法会保留instock数组中所有符合warehouse: "G"的元素,无论匹配项数量多少,完全满足你的需求。

内容的提问来源于stack exchange,提问作者Kanojian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 12:35:24