Как я могу заполнить, а затем сопоставить на основе идентификатора родителя - PullRequest
0 голосов
/ 05 января 2019

Я пытаюсь "сопоставить" ссылочный документ (заполненный) с идентификатором родительского документа. Цель состоит в том, чтобы показать только разрешения участников для конкретной организации, а не все другие разрешения, которые они могут иметь. Таким образом, «entity.item», в данном случае организация, должен соответствовать идентификатору родительской организации. Я пытаюсь выяснить, как, если возможно, получить доступ к идентификатору родительской организации из дочернего документа.

let userId = '123';
let organizations = await Organization.find().where('members.includes(userId)').populate({
    path: 'members',
    options: { sort: { name: 1 } },
    populate: {
      path: 'permissions',
      match: {
        'entity.kind': 'Organization',
        'entity.item': organization._id  //HERE
      },
      populate: {
        path: 'entity.item'
      }
    }
  });

1 Ответ

0 голосов
/ 11 января 2019

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

"С помощью синтаксиса поиска $ mongodb 3.6 и выше можно легко объединить вложенные поля без использования $ unwind."

let organizations = await Organization.aggregate([
  { $sort: { name: 1 } },
  { $match: { $expr: { $in: [ user.id, '$members' ] } } },
  {
    $lookup: {
      from: 'user',
      let: { id: '$_id', members: '$members' },
      pipeline: [
        { $match: { $expr: { $in: [ '$_id', '$$members' ] } } },
        { $addFields: { id: '$_id' } },
        {
          $lookup: {
            from: 'permission',
            pipeline: [
              { $match: { $expr: { $and: [
                { $eq: [ '$entity.kind', 'Organization' ] },
                { $eq: [ '$entity.item', '$$id' ] }
              ] } } },
              { $addFields: { id: '$_id' } },
              {
                $lookup: {
                  from: 'organization',
                  pipeline: [
                    { $match: { $expr: { $eq: [ '$_id', '$$id' ] } } },
                    { $addFields: { id: '$_id' } }
                  ],
                  as: 'entity.item'
                }                      
              }
            ],
            as: 'permissions'
          }
        }
      ],
      as: 'members'
    }
  },
  { $addFields: { id: '$_id' } }
]);
...