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
相关产品推荐
相关产品推荐

