Node.js Mongoose如何在查询Collections时返回关联的前3位作者ID
实现方案
你可以通过Mongoose的聚合查询直接实现需求,无需多次查询数据库,核心逻辑是通过关联Articles集合拿到对应作者ID,去重后截取前3位,以下是Express路由的完整实现代码:
const Collections = require('./models/collections'); // 替换为你自己的collections模型文件路径 const Articles = require('./models/article'); // 替换为你自己的article模型文件路径 const express = require('express'); const router = express.Router(); router.get('/collections', async (req, res) => { try { const result = await Collections.aggregate([ // 关联当前合集对应的所有文章 { $lookup: { from: 'articles', // MongoDB中实际的文章集合名,默认是模型名小写加s,有自定义配置请对应修改 localField: '_id', foreignField: 'collectionid', as: 'relatedArticles' } }, // 拆分文章数组为单条记录 { $unwind: '$relatedArticles' }, // 按合集分组,收集所有关联作者ID并自动去重,保留合集的基础字段 { $group: { _id: '$_id', name: { $first: '$name' }, icon: { $first: '$icon' }, authors: { $addToSet: '$relatedArticles.author' } } }, // 截取前3位作者ID,按需输出字段 { $project: { _id: 0, // 需要返回合集ID可改为1或者删除该行 name: 1, icon: 1, authors: { $slice: ['$authors', 3] } } } ]); res.json(result); } catch (err) { res.status(500).json({ error: err.message }); } }); module.exports = router;
注意事项
- 你给出的期望返回示例中
authors标注为对象格式,实际多个ID用数组更符合JSON规范,上述代码返回的authors为数组格式,如果确实需要对象格式可以在聚合查询后遍历处理为键值对结构即可。 - 如果不需要作者ID去重,可以把聚合步骤里的
$addToSet替换为$push,会按文章发布顺序取前3位作者,允许重复ID。 - 小数据量场景也可以用多次查询实现,代码更易读:
router.get('/collections', async (req, res) => { try { const collections = await Collections.find().lean(); for (let col of collections) { col.authors = await Articles.find({ collectionid: col._id }).distinct('author').limit(3); delete col._id; // 不需要返回合集ID可保留该行 } res.json(collections); } catch (err) { res.status(500).json({ error: err.message }); } })
内容的提问来源于stack exchange,提问作者Uğurcan Uçar
相关产品推荐
相关产品推荐

