мангуст заселять за другим заселять - PullRequest
0 голосов
/ 30 мая 2019

У меня есть 3 коллекции монго.

  1. Ресурс
  2. доступ
  3. Пользователь

пользователь связан с доступом, а доступ связан с ресурсом. Я хочу, чтобы при заполнении пользователя было выполнено все присоединение, и я вижу полный ресурс, к которому у пользователя есть доступ.

Я попробовал этот код, но не ожидал ответа

     Users.findById(req.params.userId)
     .populate({path:'accessID',model:'accesses'})
     .populate({path:'accessID.accessLists',model:'resources'})

и это

 Users.findById(req.params.userId)
     .populate({path:'accessID',model:'accesses'})
     .then
(
        (user)=>
        {
         Users.populate(user,{path})
        }
)



вот мои побеги

Ресурс:

  var ResourceSchema =new Schema 
       ({  
        resource:String
        method:
        {   type:String,
            enum:["GET","PUT","POST","DELETE"]
        } 
       })

Доступ:

     var AccessSchema =new Schema 
     ({
      name:String
      access_List:
     [
       { type: Schema.Types.ObjectId,  ref:'resources'}
     ]

    })

Пользователь:

     var  UserSchema = new Schema
      ({
       name:String,
       email:String,
       accessID:
       { type: Schema.Types.ObjectId, required: true, ref: 'accesses' }
      )}  

мой вывод вот так

{"accessID": 
 {
   "_id": "5cef82d1d2f7e14d3013ac8c",
           "accessLists": 
                [
               "5cee8e093defe92b88c1626b",
               "5cee8e093defe92b88c1626c",
               "5cee8e093defe92b88c1626d",
                 ],
           "name": "Admin",       
   },
"name": "ali"
"email": "ali17@yahoo.com"      
      }

но я хочу, чтобы мой вывод был таким:

 {
  "name": "ali",
   "email": "ali17@yahoo.com"
   "accessID": 
    {
       "_id": "5cef82d1d2f7e14d3013ac8c",
         "accessLists": 
       [
           {
                "_id": "5cee8e093defe92b88c1626b",
                "resource": "groups",
                "method": "POST",
            },
            {
                "_id": "5cee8e093defe92b88c1626c",
                "resource": "groups",
                "method": "DELETE",
            },
            {
                "_id": "5cee8e093defe92b88c1626d",
                "resource": "groups",
                "method": "GET",
            }
       ]
            "name": "Admin",       
          }

         }

1 Ответ

0 голосов
/ 31 мая 2019
    User.findById(req.params.userId)
        .populate({path:'accessID',model:'accesses'})
        .populate({ path: 'accessID', populate: { path: 'access_List',model:'resources' }})
        .exec(function (err, response) {
     })

Я пытался, и это работает. Дополнительная справка: Пример

также я пробовал с агрегацией:

db.users.aggregate([
   {$match : { _id : ObjectId("5cf00388eae5400e9439b2df")}},
   {
        $lookup: {
            from:"access",
            localField:"accessID",
            foreignField: "_id",
            as:"accessID"
        }
    },
    { "$unwind": '$accessID'},
    { "$unwind": '$accessID.access_List'},
    {
        $lookup: {
            from:"resources",
            localField:"accessID.access_List",
            foreignField: "_id",
            as:"access_List"
        }
    },
    {
        $group : {
            _id : {
                "_id" : '$_id', "name" : '$name', "email" : '$email',
                 "accessID" : {"_id" : '$accessID._id', "name": '$accessID.name' }
            },
            access_List : { $push : { "$arrayElemAt": [ "$access_List", 0 ] } }
        }
    },
    { $project : {
          _id : '$_id._id',
          name : '$_id.name',
          email : '$_id.email',
          accessID : {
              _id : '$_id.accessID._id',
              name:  '$_id.accessID.name',
              access_List : '$access_List'
          }

       }
    }
    ]).pretty()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...