Как расширить агрегацию MongoDB? - PullRequest
0 голосов
/ 08 сентября 2018

Я написал конвейер, который выглядит так:

db.getCollection('task_groups').aggregate(
[
  {
    $match: {status: {$ne: 3}}
  },
  {
    $lookup: {
      from: 'tasks',
      localField: '_id',
      foreignField: 'taskGroupId',
      as: 'tasks'
    }
  },
  {
    $lookup: {
      from: 'publications',
      localField: 'publicationId',
      foreignField: '_id',
      as: 'publication'
    }
  },
  {
    $unwind: '$publication'
  },
  {
    $lookup: {
      from: 'accounts',
      localField: 'publication.accountId',
      foreignField: '_id',
      as: 'account'
    }
  },
  {
    $unwind: '$account'
  }
]
)

Вывод выглядит так:

enter image description here

Массив задач имеет свойство "somebodyAccountId". Это ObjectId из коллекции "account". Как я могу расширить конвейер, чтобы получить учетную запись для каждой «задачи»?

1 Ответ

0 голосов
/ 09 сентября 2018

Вы можете использовать другой синтаксис для $lookup (Условия соединения и некоррелированные подзапросы)

Таким образом, вы можете обновить свой запрос до:

db.getCollection('task_groups').aggregate([{
        $match: {
            status: {
                $ne: 3
            }
        }
    },
    {
        $lookup: {
            from: 'tasks',
            let: {
                targetId: '$_id',
            },
            pipeline: [{
                $match: {
                    $expr: {
                        $eq: ['$taskGroupId', '$$targetId']
                    }
                }
            }, {
                $lookup: {
                    from: 'accounts',
                    localField: 'someoneAccountId',
                    foreignField: '_id',
                    as: 'account' // You might change it to another name if you want
                }
            }, {
                $unwind: '$account'
            }],
            as: 'tasks'
        }
    },
    {
        $lookup: {
            from: 'publications',
            localField: 'publicationId',
            foreignField: '_id',
            as: 'publication'
        }
    },
    {
        $unwind: '$publication'
    },
    {
        $lookup: {
            from: 'accounts',
            localField: 'publication.accountId',
            foreignField: '_id',
            as: 'account'
        }
    },
    {
        $unwind: '$account'
    }
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...