MongoDB如何仅查找匹配指定字段值的嵌入式文档
MongoDB数组嵌入式文档匹配查询的正确写法
你原来的查询逻辑存在误区:find的查询条件仅用于筛选包含匹配元素的父文档——只要父文档的data数组里有一个元素符合marketCode,整个父文档就会被返回,这就是你看到“返回完整集合(仅投影生效)”的原因。要只提取数组中匹配的子文档,可用以下几种方法:
方法1:用投影操作符$filter(推荐,保留父文档结构)
这种方式会保留父文档的year、week等字段,同时只返回data数组中匹配marketCode的元素:
const dataColl = client.db('database').collection('collection'); const data = await dataColl.find( { 'data.marketCode': marketCode }, // 先筛选出包含匹配元素的父文档 { year: 1, week: 1, data: { $filter: { input: "$data", as: "item", cond: { $eq: ["$$item.marketCode", marketCode] } } }, _id: 1 // 按需决定是否保留_id字段 } ).toArray();
方法2:用聚合管道提取所有匹配的子文档(仅需子文档时用)
如果不需要父文档的额外字段,只想得到所有匹配的data子文档,可以用聚合管道:
const dataColl = client.db('database').collection('collection'); const data = await dataColl.aggregate([ { $match: { 'data.marketCode': marketCode } }, // 筛选包含匹配元素的父文档 { $unwind: "$data" }, // 展开data数组为单个文档 { $match: { 'data.marketCode': marketCode } }, // 筛选出符合条件的子文档 { $replaceRoot: { newRoot: "$data" } }, // 将子文档作为根文档返回 // 可添加投影规则,比如 { $project: { date: 1, currencyName: 1 } } ]).toArray();
方法3:用$elemMatch投影(仅返回首个匹配元素)
注意:此方法仅能返回data数组中第一个匹配的元素,适合只需要单个匹配项的场景:
const dataColl = client.db('database').collection('collection'); const data = await dataColl.find( { 'data.marketCode': marketCode }, { year: 1, week: 1, data: { $elemMatch: { marketCode: marketCode } }, _id: 1 } ).toArray();
内容的提问来源于stack exchange,提问作者Koyejo
相关产品推荐
相关产品推荐

