如何使用Mongoose查询每个发件人对应的单条邮件记录
实现方案
你可以通过Mongoose的聚合管道能力实现该需求,核心是用$group操作符按sender字段分组,每组仅保留1条文档即可,以下是可直接运行的代码示例:
兼容全版本实现
假设你的邮件集合对应的Mongoose模型为EmailModel,要获取和示例一致的每个发件人最早的1条邮件,代码如下:
const queryResult = await EmailModel.aggregate([ // 可选:如果需要筛选特定收件人的邮件,保留该阶段,否则直接删除即可 { $match: { receiver: "Kate" } }, // 按发件人分组,每组取第一条文档的对应字段 { $group: { _id: "$sender", mailId: { $first: "$_id" }, receiver: { $first: "$receiver" } // 如果你有其他需要返回的字段,按上述格式追加即可 } }, // 还原字段为原始文档的命名格式 { $project: { _id: "$mailId", sender: "$_id", receiver: 1 // 其他需要返回的字段同步追加 } }, // 可选:按文档_id升序排列,和示例结果顺序保持一致 { $sort: { _id: 1 } } ])
如果需要取每个发件人最新的1条邮件,只需要在$group阶段前添加排序阶段,将文档按创建时间倒序排列即可:
// 加在$group阶段前面即可 { $sort: { _id: -1 } }
高版本MongoDB简化实现
如果你使用的是MongoDB 5.2及以上版本,可以用$top操作符直接提取整个文档,不需要逐个声明字段:
const queryResult = await EmailModel.aggregate([ { $match: { receiver: "Kate" } }, { $group: { _id: "$sender", latestMail: { $top: { output: "$$ROOT", sortBy: { _id: 1 } } } } }, // 直接将提取的文档作为根节点返回 { $replaceRoot: { newRoot: "$latestMail" } }, { $sort: { _id: 1 } } ])
内容的提问来源于stack exchange,提问作者user15344186
相关产品推荐
相关产品推荐

