如何在指定MongoDB项目中按Issue名称查询关联Issue?
实现方法
由于你的Project文档仅存储了Issue的ObjectId,无法直接通过Project模型按Issue名称查询,以下是两种可行的实现方案:
方案一:分步查询
先定位目标Issue的ID,再查询包含该ID的指定项目:
// 1. 根据Issue名称查找对应的Issue文档 const targetIssue = await Issue.findOne({ issue: "developement" }); if (!targetIssue) { console.log("未找到名称为developement的Issue"); return; } // 2. 查询包含该Issue的指定项目(可添加项目专属条件,比如按项目名称过滤) const targetProject = await Project.findOne({ issues: targetIssue._id, // 示例:指定项目名称 // name: "你的目标项目名称" }).populate("issues"); // 可选,执行后可直接获取关联Issue的完整数据 console.log(targetProject);
方案二:聚合查询(一步完成)
利用MongoDB聚合管道关联Issue集合,直接筛选出符合条件的项目及对应Issue:
const result = await Project.aggregate([ // 可选:先匹配指定项目(如按项目名称) { $match: { name: "目标项目名称" } }, // 关联Issue集合 { $lookup: { from: "issues", // Issue模型对应的集合名(Mongoose默认转小写复数,自定义集合名需替换) localField: "issues", foreignField: "_id", as: "issues" } }, // 筛选包含目标Issue的项目 { $match: { "issues.issue": "developement" } }, // 可选:仅保留符合条件的Issue,过滤掉其他关联Issue { $addFields: { issues: { $filter: { input: "$issues", cond: { $eq: ["$$this.issue", "developement"] } } } } } ]); console.log(result);
注意事项
- 确认Issue集合名称正确:Mongoose默认会将模型名转为小写复数(如
Issue对应issues),若自定义过集合名称请替换为实际名称。 - 如需模糊匹配Issue名称,可将
$eq替换为$regex,例如{ $regex: "developement", $options: "i" }实现不区分大小写的模糊查询。
内容的提问来源于stack exchange,提问作者Ganesh Nanhe
相关产品推荐
相关产品推荐

