mongodb多表关联查询并分页

Model

多表查询分页可以使用mongoose-aggregate-paginate-v2

interface表Model

    1. const aggregatePaginate =require('mongoose-aggregate-paginate-v2');
    2. module.exports = app =>{
    3. const mongoose = app.mongoose;
    4. const schema =new mongoose.Schema({
    5. // 自增ID
    6. id:{ type:Number, unique:true},
    7. // ...省略
    8. // 创建人

    1. createBy:{ type:String},

    1. // 更新时间

    1. updateTime:{ type:String},

    1. // 更新人

    1. updateBy:{ type:String},

    1. });

    1. schema.plugin(aggregatePaginate);

    1. // mongoose.model(名称,数据,表名)

    1. return mongoose.model('system Interface', schema,'interface');

    1. };

user表Model

    1. const aggregatePaginate =require('mongoose-aggregate-paginate-v2');

    1. module.exports = app =>{

    1. const mongoose = app.mongoose;

    1. const schema =new mongoose.Schema({

    1. // 自增ID

    1. id:{ type:Number, unique:true},

    1. // 用户唯一ID

    1. uuid:{ type:String, unique:true},

    1. // 用户角色

    1. roleId:{ type:Number},

    1. // 用户名-用于登录,找回密码

    1. userName:{ type:String, unique:true},

    1. // ...省略

    1. });

    1. schema.plugin(aggregatePaginate);

    1. // mongoose.model(名称,数据,表名)

    1. return mongoose.model('user-list', schema,'user');

    1. };

Service

命令功能描述
$project指定输出文档里的字段.
$match选择要处理的文档,与fine()类似。
$limit限制传递给下一步的文档数量。
$skip跳过一定数量的文档。
$unwind扩展数组,为每个数组入口生成一个输出文档。
$group根据key来分组文档。
$sort排序文档。
$geoNear选择某个地理位置附近的的文档。
$out把管道的结果写入某个集合。
$redact控制特定数据的访问。
$lookup多表关联(3.2版本新增)

这里就是使用$lookup进行多表关联查询,$lookup可以设置多个,通过不同的字段,关联不同的表

    1. async list(page, pageSize, query,select){

    1. const{ ctx }=this;

    1. // 关联查询user表

    1. const aggregateQuery = ctx.model.System.Interface.aggregate([

    1. {

    1. $lookup:{

    1. // 关联的表

    1. from:'user',

    1. // 当前表关联的字段(如现在的Interface表)

    1. localField:'createBy',

    1. // 关联的表的字段(user表的userName字段)

    1. foreignField:'userName',

    1. // 查询出来的关联数据,存放在'createUser'字段中

    1. as:'createUser',

    1. },

    1. },

    1. {

    1. $lookup:{

    1. from:'user',

    1. localField:'updateBy',

    1. foreignField:'userName',

    1. as:'updateUser',

    1. },

    1. },

    1. {

    1. // $project:设置0隐藏某些字段 ,让其不返回

    1. $project:{

    1. createUser:{

    1. _id:0,

    1. __v:0,

    1. uuid:0,

    1. password:0,

    1. updateBy:0,

    1. updateTime:0,

    1. createTime:0,

    1. createBy:0,

    1. registerTime:0,

    1. },

    1. updateUser:{

    1. _id:0,

    1. __v:0,

    1. uuid:0,

    1. password:0,

    1. updateBy:0,

    1. updateTime:0,

    1. createTime:0,

    1. createBy:0,

    1. registerTime:0,

    1. },

    1. __v:0,

    1. ...select,

    1. },

    1. },

    1. ]);

    1. const list = await ctx.model.System.Interface.aggregatePaginate(

    1. aggregateQuery,

    1. {

    1. page:Number(page)||1,

    1. // 每页数

    1. limit:Number(pageSize)||10,

    1. sort:{ menuId:1},

    1. },

    1. );

    1. return list;

    1. }

以上是 mongodb多表关联查询并分页 的全部内容, 来源链接: www.h5w3.com/123385.html

回到顶部