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

