MongoDB单查询实现按数组每个值返回对应单条文档
一次查询返回数组中每个值对应的单条文档
场景说明
当你传入值数组(如["GB", "FR", "DE"]),需要为数组中每个值各返回一条匹配的MongoDB文档,而非循环多次查询时,可根据不同需求选择以下方案:
方案1:仅返回有匹配的文档(每个值对应一条)
适用于仅关心存在匹配的情况,若某个值无对应文档则不返回结果。假设集合为countries,匹配字段为countryCode:
db.countries.aggregate([ // 筛选出所有匹配目标数组的文档 { $match: { countryCode: { $in: ["GB", "FR", "DE"] } } }, // (可选)按时间降序排序,确保取最新的一条文档,可替换为你的业务排序字段 { $sort: { createdAt: -1 } }, // 按countryCode分组,取每组的第一个文档 { $group: { _id: "$countryCode", doc: { $first: "$$ROOT" } } }, // 将分组后的文档还原为原结构输出 { $replaceRoot: { newRoot: "$doc" } } ])
- 若无需指定返回最新/最早的文档,可去掉
$sort步骤,直接通过$first或$last取任意一条匹配文档。 - 如果集合中每个
countryCode唯一(即每个值仅对应一条文档),直接使用普通查询即可:db.countries.find({ countryCode: { $in: ["GB", "FR", "DE"] } })
方案2:强制每个输入值都返回结果(含无匹配的情况)
适用于需要保证输入数组中每个值都有对应结果的场景,无匹配时返回null:
db.aggregate([ // 构造包含目标值的数组文档 { $documents: [{ codes: ["GB", "FR", "DE"] }] }, // 展开数组,每个值生成一条独立文档 { $unwind: "$codes" }, // 关联目标集合,仅取一条匹配文档 { $lookup: { from: "countries", localField: "codes", foreignField: "countryCode", as: "matchedDoc", pipeline: [{ $limit: 1 }] } }, // 展开匹配结果,无匹配时保留null { $unwind: { path: "$matchedDoc", preserveNullAndEmptyArrays: true } }, // 整理输出结构 { $project: { _id: 0, countryCode: "$codes", document: "$matchedDoc" } } ])
内容的提问来源于stack exchange,提问作者Andrew Fletcher
相关产品推荐
相关产品推荐

