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

