我是 mongodb 和 mongoose 的新手,我在 mongoose 文档中搜索的越多,我就越迷路。
说我有一个user
它的name
字段有值John, John 有两个role
s:
- 超级用户
- 行政
这个 s 中的每一个role
都有一些permissions
:
- 超级用户
- 添加问题
- 编辑问题
- 删除问题
- 行政
- 添加问题
- 查看答案
如您所见,每个都有重复项role
,我怎样才能在没有重复项的数组中获取用户JohnaddQuestion
的权限(此示例中的重复项是),如下所示:
['addQuestion', 'editQuestion', 'removeQuestion', 'viewAnswer']
这是我的架构:
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var deepPopulate = require('mongoose-deep-populate')(mongoose);
var UserSchema = new Schema({
name: String,
user_roles: [{
type: Schema.ObjectId,
ref: 'Role'
}]
});
var RoleSchema = new Schema({
name: String,
permissions: [
{
type: Schema.ObjectId,
ref: 'Permission'
}
]
});
var PermissionSchema = new Schema({
name: String
});
UserSchema.plugin(deepPopulate, {
whitelist: ['user_roles.permissions']
});
var User = mongoose.model('User', UserSchema),
Role = mongoose.model('Role', RoleSchema),
Permission = mongoose.model('Permission', PermissionSchema);
如您所见,我没有permissions
数组中的权限名称,我有引用(ObjectId
s)。
我只有一个userId
来自网址。所以:
User.findById(userId)
.deepPopulate('user_roles')
.deepPopulate('user_roles.permissions')
.distinct('permissions')
.distinct('user_roles.permissions')
.exec((err, user)=> {
if(err) res.send(err);
????
res.json(permissionsArr);
});
我应该使用distinct
吗?我可以distinct
不populate
先使用 ing 吗?还是必须的?或者distinct
我应该使用user
传入回调的项目而不是????
使用user
参数(使用find
方法)来获取所有角色,并为所有角色获取权限,然后从permissionsArr
数组中删除重复项?
更新:这是我使用猫鼬制作的休息 api 的结果,获取用户角色(GET http://localhost/api/users/:userId/roles):
app.get('/api/users/:userId/roles', function(req,res) {
User.findById( req.params.userId )
.deepPopulate('user_roles.permissions')
.select('user_roles')
.exec((err, users)=> {
if(err) next(err);
res.json(users);
});
}
结果:
{
"name": "John",
"_id": "56e677c1a7e7007d5cc245ef",
"user_roles": [
{
"_id": "56e64f057e8008263dec2cc9",
"name": "superuser",
"permissions": [
{
"name": "removeQuestion",
"_id": "56e408a9d863a8cf4d7ab001"
},
{
"name": "addQuestion",
"_id": "56e64d657e8008263dec2cc4"
},
{
"name": "addAnswer",
"_id": "56e64cf87e8008263dec2cc3"
},
{
"name": "viewQuestion",
"_id": "56e64e1e7e8008263dec2cc5"
},
{
"name": "viewAnswer",
"_id": "56e64e267e8008263dec2cc6"
}
]
},
{
"_id": "56e64ec27e8008263dec2cc8",
"name": "admin",
"permissions": [
{
"name": "addQuestion",
"_id": "56e64d657e8008263dec2cc4"
},
{
"name": "addAnswer",
"_id": "56e64cf87e8008263dec2cc3"
},
{
"name": "viewQuestion",
"_id": "56e64e1e7e8008263dec2cc5"
},
{
"name": "viewAnswer",
"_id": "56e64e267e8008263dec2cc6"
}
]
}
现在我需要的是GET
http://localhost/api/users/:userId/permissions并通过它获取用户拥有的,但重复项已被删除。(permissions
不应该直接。)roles
user
permissions
感谢您抽出宝贵的时间以及您能够提供的任何帮助。