MongoDB多集合关联:按匹配id关联news和newscategory集合的实现方法
MongoDB多集合关联实现方案
MongoDB完全支持多集合关联操作,针对你的需求可以通过**聚合管道(Aggregation Pipeline)**结合$lookup关联阶段实现,具体操作如下:
核心实现代码
你需要对news集合执行聚合查询,分阶段处理数据,最终得到符合预期的输出:
db.news.aggregate([ // 1. 展开news数组,将每条新闻拆分为独立文档方便处理 { $unwind: "$news" }, // 2. 关联newscategory集合,匹配对应分类 { $lookup: { from: "newscategory", let: { catId: "$news.categoryId", newsLang: "$lang" }, pipeline: [ // 先匹配相同语言,缩小查询范围提升效率 { $match: { $expr: { $eq: ["$lang", "$$newsLang"] } } }, // 过滤出ID匹配的分类项 { $project: { _id: 0, category: { $filter: { input: "$categories", cond: { $eq: ["$$this._id", "$$catId"] } } } } }, { $unwind: "$category" }, // 仅保留分类本身的字段作为返回结果 { $replaceRoot: { newRoot: "$category" } } ], as: "news.category" // 你预期输出中的caregory为拼写错误,若需要保留错误命名可修改为"news.caregory" } }, // 3. 转换ObjectId、日期类型为字符串,匹配预期输出格式 { $addFields: { "news.categoryId": { $toString: "$news.categoryId" }, "news.createdAt": { $dateToString: { date: "$news.createdAt" } }, "news._id": { $toString: "$news._id" }, "news.category._id": { $toString: "$news.category._id" } } }, // 4. 重新合并news数组,恢复原文档结构 { $group: { _id: { $toString: "$_id" }, lang: { $first: "$lang" }, news: { $push: "$news" } } } ])
补充说明
- 如果不需要按语言匹配分类,可以直接删除
$lookup管道中对应$match阶段 - 如果你使用的是MongoDB 5.0以上版本,也可以配合
$lookup的localField和foreignField参数结合$unwind实现,性能差异不大 - 上述代码返回的结构和你给出的预期输出完全一致,仅修正了分类字段的拼写错误,如有特殊需求可以自行调整字段名
内容的提问来源于stack exchange,提问作者Azad Samedov
相关产品推荐
相关产品推荐

