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

Mongoose如何通过另一字段单次查询获取嵌套文档

单次查询实现方案

你可以通过MongoDB聚合管道完成需求,无需分两次查询,根据你使用的MongoDB版本可选择对应实现:

方案1(MongoDB 5.0及以上版本推荐,性能更优)

利用$getField运算符动态读取对象属性,代码如下:

const queryResult = await schema.aggregate([
  // 匹配指定_id的目标文档
  { $match: { _id: "3434v4vcvc254t34vtds" } },
  // 直接提取currentItemId对应的items子属性
  {
    $project: {
      targetItem: { $getField: { input: "$items", field: "$currentItemId" } },
      _id: 0 // 不需要返回文档_id可保留该行,否则删除
    }
  }
])
// 取出最终目标item
const targetItem = queryResult[0]?.targetItem

方案2(兼容MongoDB 5.0以下版本)

通过$objectToArray将嵌套对象转为数组后过滤取值:

const queryResult = await schema.aggregate([
  { $match: { _id: "3434v4vcvc254t34vtds" } },
  // 将items对象转为 [{k:"键名",v:"值"},...] 格式的数组
  { $addFields: { itemsArray: { $objectToArray: "$items" } } },
  // 过滤出键名等于currentItemId的元素
  {
    $project: {
      matchedItem: {
        $first: {
          $filter: {
            input: "$itemsArray",
            cond: { $eq: ["$$this.k", "$currentItemId"] }
          }
        }
      }
    }
  },
  // 提取最终的item值
  { $project: { targetItem: "$matchedItem.v", _id: 0 } }
])
const targetItem = queryResult[0]?.targetItem

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 00:54:03