我正在研究一个keystonejs项目,并且遇到了两个模型之间关系的问题。
我有以下两种型号:
用户模型:
User.add({
name: { type: Types.Name, required: true, index: true },
email: { type: Types.Email, initial: true, required: true, index: true },
number: { type: Types.Number, index: true },
password: { type: Types.Password, initial: true, required: true }
}, 'Permissions', {
isAdmin: { type: Boolean, label: 'Can access Keystone', index: true },
}, 'Groups', {
groups: {type: Types.Relationship, ref: 'Group', many: true }
});
我有一个群组模型
Group.add({
name: { type: String, required: true, index: true },
description: { type: String, initial: true, required: true, index: true}
});
我有一个聚合函数,它基本上会拉动所有拥有用户的组
User.model.aggregate({$group:{'_id':'$groups'}}).exec(function(err,data){
console.log(data);
});
我的问题是上面的聚合只按我们的_id值显示我的群组而不是他们的名字。
我如何填充并显示前端的名称?显然,后端需要id来引用,但对于那些不能工作的前端用户来说。
由于
答案 0 :(得分:2)
你可以很容易地创造你想要的东西,所以不要气馁。你只需要在mongoose中使用'.populate()'函数。见下面的例子。
用户模型(稍微整理 - 我删除了(奇怪的?)嵌套)
User.add({
name: { type: Types.Name, required: true, index: true },
email: { type: Types.Email, initial: true, required: true, index: true},
number: { type: Types.Number, index: true },
password: { type: Types.Password, initial: true, required: true },
isAdmin: { type: Boolean, label: 'Can access Keystone', index: true },
groups: {type: Types.Relationship, ref: 'Group', many: true }
});
群组模型 - 请注意我为了方便管理而在底部附近添加了Group.relationship({})选项(显示在后端引用该群组的用户)
Group.add({
name: { type: String, required: true, index: true },
description: { type: String, initial: true, required: true, index: true}
});
Group.relationship({ ref: 'User', path: 'users', refPath:'Groups'});
控制器获取包含所有相应组信息的用户列表
view.on('init', function(next) {
keystone.list('User').model.find()
.populate('groups')
.exec(function(err, users) {
if(err) {
console.log(err);
return next(err);
} else {
locals.data.users = users;
next(err);
}
});
});
控制器让特定组内的用户显示在前端(您首先需要组ID)
view.on('init', function(next) {
keystone.list('User').model.find()
.where('Groups').in([array, of, group, ids])
.populate('groups')
.exec(function(err, users) {
if(err) {
console.log(err);
return next(err);
} else {
locals.data.users = users;
next(err);
}
});
});
locals.data.users会在每种情况下都这样返回:
[
{
_id: '',
name: '',
...
groups: [
{
_id: '',
name: ''
...
}
]
}
]