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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 02:50:27