gpt4 book ai didi

javascript - 多对多关系 - 在查询中填充相关数据 - Keystonejs

转载 作者:行者123 更新时间:2023-11-30 16:28:29 24 4
gpt4 key购买 nike

我在这里做一个 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 在后端是必需的,但对于前端用户来说是行不通的。

谢谢

最佳答案

您可以很容易地创建您想要的东西,所以不要气馁。您只需要注意 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'});

Controller 获取用户列表及其所有相应的组信息

 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);
}
});
});

Controller 让特定组内的用户显示在前端(您首先需要组 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: ''
...
}
]
}
]

关于javascript - 多对多关系 - 在查询中填充相关数据 - Keystonejs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33743264/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com