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

MongoDB如何按user_id查询文档并返回list数组中匹配的子文档

MongoDB 单文档数组子元素筛选实现方案

现有集合结构

{
  "_id": 0,
  "user_id": 12,
  "list": [{"_.id":0, "name":"john"},{"_.id":1, "name":"hanna"}]
},
{
  "_id": 1,
  "user_id": 22,
  "list": [{"_.id":0, "name":"john"},{"_.id":1, "name":"hanna"}]
}

需求说明

根据指定user_id匹配对应文档,仅返回文档中list数组内满足name:"john"的子文档。

实现方法

方法1:find + $elemMatch 投影(最简方案)

适合只需要取第一个匹配子文档的场景,代码如下:

// 示例查询user_id=12的文档中符合要求的子文档
const result = db.collection.findOne(
  { user_id: 12 },
  {
    _id: 0, // 可选,不需要返回文档_id可添加
    list: { $elemMatch: { name: "john" } }
  }
)
// 最终目标子文档为 result.list[0]

方法2:聚合查询(灵活适配多场景)

适合需要返回所有匹配子文档、或直接输出子文档结构的场景,代码如下:

db.collection.aggregate([
  // 第一步:匹配指定user_id的文档
  { $match: { user_id: 12 } },
  // 第二步:拆分list数组为单条记录
  { $unwind: "$list" },
  // 第三步:筛选符合条件的子文档
  { $match: { "list.name": "john" } },
  // 可选步骤:直接把子文档作为根节点返回,不需要额外提取数组元素
  { $replaceRoot: { newRoot: "$list" } }
])

注意事项

  • $elemMatch投影仅返回数组中第一个符合条件的元素,若存在多个匹配项需使用聚合方案
  • 子文档字段名需和实际存储完全一致,示例中_.id为你提供的结构中的特殊字段,查询时不要误写为_id

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 16:42:01