问题描述
在平常的开发中,关联表的使用很常见,在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);
})
}
如此,问题得以解决。