Mongoose+Node.js:如何查询关联集合中符合职位条件的申请人?
问题分析与解决方法
你的写法确实存在错误。Applications集合中的jobID字段存储的是Jobs集合文档的_id(ObjectId类型),并非包含title字段的嵌套对象,所以直接通过"jobID.title"进行查询无法匹配到任何数据。
下面提供两种可行的解决方式:
方式一:使用MongoDB聚合查询($lookup)
通过聚合管道关联Applications和Jobs两个集合,先建立关联再筛选符合条件的数据:
Applications.aggregate([ // 关联Jobs集合,获取对应职位信息 { $lookup: { from: "jobs", // 目标集合名称(注意是MongoDB中的集合名,不是Mongoose模型名) localField: "jobID", // Applications中用于关联的字段 foreignField: "_id", // Jobs中用于关联的字段 as: "jobDetails" // 关联结果存储的字段名 } }, // 筛选职位标题为"5+ Y Engineer"的申请 { $match: { "jobDetails.title": "5+ Y Engineer" } }, // 按需选择返回的字段,比如只保留申请人信息 { $project: { applicant: 1, _id: 1 } } ]) .then(results => console.log(results)) .catch(err => console.error(err));
方式二:使用Mongoose的populate(需提前定义Schema关联)
如果已经在Mongoose中为两个集合定义了关联关系,可以用populate简化查询:
首先定义Jobs和Applications的Schema:
const mongoose = require('mongoose'); // Jobs集合Schema const jobSchema = new mongoose.Schema({ title: String }); const Job = mongoose.model('Job', jobSchema); // Applications集合Schema,关联Job模型 const applicationSchema = new mongoose.Schema({ applicant: String, jobID: { type: mongoose.Schema.Types.ObjectId, ref: 'Job' // 指定关联的Mongoose模型 } }); const Application = mongoose.model('Application', applicationSchema);
然后执行查询:
Application.find() // 关联jobID字段,并筛选职位标题匹配的记录 .populate({ path: 'jobID', match: { title: '5+ Y Engineer' } }) // 过滤掉未匹配到对应职位的申请记录 .where('jobID').ne(null) // 选择需要返回的字段 .select('applicant _id') .then(results => console.log(results)) .catch(err => console.error(err));
内容的提问来源于stack exchange,提问作者saurabh gupta
相关产品推荐
相关产品推荐

