私はmongodbとmongooseが初めてで、mongooseのドキュメントを検索すればするほど、迷子になります。フィールドの値がJohn
である
があるuser
とします。Johnには 2 つの があります。name
role
- スーパーユーザー
- 管理者
このrole
s のそれぞれには、次のようなものがありますpermissions
。
- スーパーユーザー
- 追加質問
- 編集質問
- 削除質問
- 管理者
- 追加質問
- 見る答え
ご覧のとおり、それぞれに重複があります。次のように、重複のない配列でユーザーJohnrole
のアクセス許可を取得するにはどうすればよいですか(この例で繰り返されるのは です)。 addQuestion
['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
。
私userId
はURLから来ただけです。それで:
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
か? 最初に ingdistinct
なしで使用できますか? populate
それとも必須ですか?または、コールバックに渡されdistinct
たアイテムを使用する代わりに、(メソッドを使用して)パラメーターを使用してすべてのロールを取得し、すべてのロールに対してアクセス許可を取得してから、配列から重複を削除する必要がありますか?user
????
user
find
permissionsArr
更新: これは、mongoose を使用して作成した残りの 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/permissionspermissions
であり、それによってユーザーが持っているのを取得しroles
ますが、重複は削除されています.(直接user
持つべきではありません.)permissions
お時間を割いていただき、ご協力いただきありがとうございます。