如何从已查询的广告集合关联获取对应公司文档?
解决方法:关联广告与公司数据
你可以通过两种方式实现广告数据与对应公司数据的关联查询,下面分别说明:
方法一:使用Mongoose的populate(推荐)
这是Mongoose专为关联集合设计的便捷功能,需要先修正Schema并建立关联关系:
1. 修正Schema并定义关联
你的adsSchema中companyId类型为String,但companies集合的_id是Number,类型不匹配会导致关联失败,先修正类型并添加ref关联:
// 先定义公司Schema和Model const companiesSchema = mongoose.Schema( { _id: Number, name: String, url: String, } ); const CompanyModel = mongoose.model("company", companiesSchema); // 修正广告Schema,添加关联 const adsSchema = mongoose.Schema( { _id: Number, companyId: { type: Number, // 改为与companies._id一致的Number类型 ref: "company" // 关联到company集合的Model }, primaryText: String, headline: String, } ); const AdsModel = mongoose.model("ad", adsSchema);
2. 执行关联查询
查询广告时,通过populate方法自动拉取对应的公司数据:
let prods = await AdsModel.find({ primaryText: { $regex: keyword, $options: "i" }, }).populate("companyId"); // 指定要关联的字段,自动替换为对应公司文档 // 返回结果示例: // [ // { // _id: 1, // companyId: { _id: 3, name: "Salesforce", url: "http://salesforce.com/" }, // primaryText: "...", // headline: "..." // }, // ... // ]
方法二:手动关联查询
如果不想修改Schema,也可以分两步手动实现关联:
1. 查询符合条件的广告
let prods = await AdsModel.find({ primaryText: { $regex: keyword, $options: "i" }, });
2. 提取companyId并查询对应公司
注意统一类型(将companyId转为Number,匹配companies的_id类型):
// 提取所有广告的companyId,去重并转为Number类型 const companyIds = [...new Set(prods.map(ad => Number(ad.companyId)))]; // 查询对应的公司数据 const companies = await CompanyModel.find({ _id: { $in: companyIds } }); // 合并公司数据到广告对象(按需调整结构) const adsWithCompanies = prods.map(ad => { const company = companies.find(c => c._id === Number(ad.companyId)); return { ...ad.toObject(), company: company || null // 添加company字段存储对应公司文档 }; });
注意事项
- 必须保证
companyId的类型与companies._id一致,否则关联会失败(你的示例中ads的companyId是数字,但Schema定义为String,需修正)。 - 使用
populate时,ref的值要与公司Model的名称一致(即mongoose.model("company", ...)中的第一个参数)。
内容的提问来源于stack exchange,提问作者Aniket Pandey
相关产品推荐
相关产品推荐

