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

如何通过Mongoose查询嵌套数组中的指定对象?

MongoDB 查询数组中指定对象并仅返回该对象内容

现有集合数据

[
  {
    _id: new ObjectId("63cc22dfe258792490ac0fb5"),
    categoryName: 'Rental Equipment',
    products: [
      {
        _id: new ObjectId("63ce9701ba256f972473cd6a"),
        partName: 'product one',
        partNumber: 'ym129150-35151'
      },
      {
        _id: new ObjectId("63ce2221207c858d01a3c8ac"),
        partName: 'product two',
        partNumber: 'ym129150-35151'
      }
    ]
  },
  {
    _id: new ObjectId("63cc22dfe258792490ac0fb5"),
    categoryName: 'Engine Parts',
    products: [
      {
        _id: new ObjectId("23ce9701ba156f972473cd3a"),
        partName: 'product one',
        partNumber: 'ym129150-35151'
      },
      {
        _id: new ObjectId("73ce2221203c858d01a3c83b"),
        partName: 'product two',
        partNumber: 'ym129150-35151'
      }
    ]
  }
]

尝试的查询代码

const product = db.collection.find({
  products: {
    $elemMatch: {
      _id: "63ce9701ba256f972473cd6a"
    }
  }
});

问题

上述查询会返回包含目标products对象的整个文档,而我需要仅返回指定的products对象:

{
  _id: new ObjectId("63ce9701ba256f972473cd6a"),
  partName: 'product one',
  partNumber: 'ym129150-35151'
}

解决方案

方法1:使用聚合管道(推荐)

通过$unwind展开数组,$match匹配目标对象,再用$replaceRoot将匹配到的products对象作为根文档返回:

const product = db.collection.aggregate([
  // 匹配包含目标products对象的文档
  { $match: { "products._id": ObjectId("63ce9701ba256f972473cd6a") } },
  // 展开products数组
  { $unwind: "$products" },
  // 匹配指定的products对象
  { $match: { "products._id": ObjectId("63ce9701ba256f972473cd6a") } },
  // 将products对象作为根文档返回
  { $replaceRoot: { newRoot: "$products" } }
]);

方法2:使用find投影返回匹配的数组元素

如果目标_id唯一,可通过投影返回仅包含匹配元素的数组,再提取数组第一项:

const result = db.collection.find(
  { "products._id": ObjectId("63ce9701ba256f972473cd6a") },
  { "products.$": 1, _id: 0 }
).toArray()[0].products[0];

方法3:使用聚合的$filter(MongoDB 3.2+)

通过$filter筛选数组目标元素,再用$arrayElemAt取出匹配项并替换根文档:

const product = db.collection.aggregate([
  { $match: { "products._id": ObjectId("63ce9701ba256f972473cd6a") } },
  {
    $project: {
      product: {
        $arrayElemAt: [
          {
            $filter: {
              input: "$products",
              cond: { $eq: ["$$this._id", ObjectId("63ce9701ba256f972473cd6a")] }
            }
          },
          0
        ]
      },
      _id: 0
    }
  },
  { $replaceRoot: { newRoot: "$product" } }
]);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 22:40:56