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
相关产品推荐
相关产品推荐

