mongoose populate 根据关联表中的字段排序

问题描述

在平常的开发中,关联表的使用很常见,在MongoDB中也是如此。

如下,有一张菜单表  tb_menu_info:

var MenuSchema = new Schema({
    menu_name: String,       //菜单名称
    menu_code: {type:String,unique: true},       //菜单编码 唯一
    menu_url: String,        //菜单URL
    menu_sys: String,        //所属系统
    menu_parent: String,     //上级菜单
    menu_icon: String,       //菜单图标
    menu_sort: Number,       //排序号
    menu_status: Number      //状态   1:启用,2:禁用
}, {
    collection: 'tb_menu_info'
});

exports.Menu = mongoose.model('menu', MenuSchema);

​

有一张角色-菜单关联表 tb_role_menu_info ,如下:

var roleMenuSchema = new Schema({
    role_id:{type:Schema.Types.ObjectId,ref:'role'},
    menu_id:[{type:Schema.Types.ObjectId,ref:'menu'}]
},{
    collection:'tb_role_menu_info'
});
exports.RoleMenu = mongoose.model('roleMenu',roleMenuSchema);

现在我们要通过 角色ID,查询对应的菜单详情,可以通过populate进行如下查询:

function getMenusByRoleId(roleId){
    //获取query对象
    var query = RoleMenuModel.find({});

    //根据角色ID查询
    query.where('role_id',roleId);

    //联查出menu_id对应的menu对象
    query.populate('menu_id');

    //按照菜单ID升序排列
    query.sort({'menu_id':1});

    //查询结果
    query.exec().then(function(result){
        console.log(result);
    }).catch(function(err){
        console.log(err);
    })
}

我们可以看到,这基本上已经实现了对一个表查询的基本需求,比如查询,排序等。

但是现在的问题是,如果我们要使用 tb_menu_info 中的 menu_sort 字段对查询结果进行排序,如何操作呢?

问题解决

通过阅读mongoose中的populate文档可以发现,populate方法中的参数可以指定排序字段,于是做出如下调整,代码如下:

function getMenusByRoleId(roleId){
    //获取query对象
    var query = RoleMenuModel.find({});

    //根据角色ID查询
    query.where('role_id',roleId);

    //联查出menu_id对应的menu对象
    // path:表示需要关联查询的字段;options关联查询的其他条件,我这里加了排序条件,按照menu_sort升序排列
    query.populate({path:'menu_id',options:{sort:{'menu_sort':1}}});

    //按照菜单ID升序排列
    query.sort({'menu_id':1});

    //查询结果
    query.exec().then(function(result){
        console.log(result);
    }).catch(function(err){
        console.log(err);
    })
}

如此,问题得以解决。

 

 

你可能感兴趣的:(Nodejs,mongodb,mongoose,populate,mongodb,nodejs)