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

MongoDB(Mongoose)如何实现公司数据分页并关联查询对应用户邮箱

你当前查询的主体是users,所以会先对用户分页再关联公司。要实现公司分页+关联对应邮箱,只需要把查询主体切换为companies,通过反向关联或者聚合查询实现即可,下面是两种可行方案:


方案1:使用Mongoose虚拟关联(推荐,符合Mongoose常规使用习惯)

需要先给CompanySchema添加虚拟关联字段,无需修改数据库已有数据:

var CompanySchema = new Schema({
    company_name: {
        type: String,
        required: true
    }
})
// 新增虚拟关联字段,绑定用户表
CompanySchema.virtual('users', {
  ref: 'users', // 要关联的用户模型名
  localField: '_id', // 公司表的关联字段
  foreignField: 'company_id', // 用户表的关联字段
  justOne: false // 一个公司对应多个用户,返回数组
})
// 配置虚拟字段可在查询结果中输出
CompanySchema.set('toObject', { virtuals: true })
CompanySchema.set('toJSON', { virtuals: true })

application.accountDB.model('companies', CompanySchema)

之后就可以直接对公司做分页查询,同时关联用户邮箱:

const Company = application.accountDB.model('companies')
const companyPageResult = await Company.find(
  {}, // 可填写公司的筛选条件
  null, 
  { 
    limit: 10, 
    skip: 0 * 10, // 分页跳过条数,规则为 页码*每页条数
    sort: { _id: -1 } // 可自定义排序规则
  }
).populate({
  path: 'users',
  select: 'customer_email -_id', // 仅返回用户邮箱字段,去掉默认的_id字段
  model: application.accountDB.model('users')
})

方案2:直接使用MongoDB聚合查询(无需修改Schema)

如果不想调整Schema定义,可以直接用aggregate聚合实现关联查询:

const Company = application.accountDB.model('companies')
const companyPageResult = await Company.aggregate([
  // 公司筛选条件,无筛选则留空
  { $match: {} },
  // 排序,建议添加避免分页顺序错乱
  { $sort: { _id: -1 } },
  // 分页跳过条数
  { $skip: 0 * 10 },
  // 每页条数
  { $limit: 10 },
  // 关联用户表
  {
    $lookup: {
      from: 'users', // MongoDB中用户集合的实际名称
      localField: '_id',
      foreignField: 'company_id',
      as: 'users'
    }
  },
  // 仅返回需要的字段
  {
    $project: {
      company_name: 1,
      'users.customer_email': 1
    }
  }
])

注意事项

  • 若你的UserSchema里company_id定义的是ObjectId类型而非String,请确保关联时字段类型匹配,否则会关联不到数据
  • 分页的skip计算规则可根据你的页码起始值调整,如果页码从1开始,改为(page-1)*limit即可

内容的提问来源于stack exchange,提问作者ajay kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 01:24:07