You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 16:57:03