mongodb: как извлечь поле вместо получения объекта с агрегатом + $ lookup + $ project - PullRequest
0 голосов
/ 21 сентября 2018

У меня два контракта.

// UserInfo
{ _id: '1', name: 'Alice' }
{ _id: '2', name: 'Bob' }
{ _id: '3', name: 'Charlie' }

// Application
{ _id: '00', userId: '1', jobId: 'gg' }
{ _id: '01', userId: '1', jobId: 'fb' }
{ _id: '02', userId: '2', jobId: 'ms' }

Я хочу получить:

{ name: 'Alice', jobIds: [ 'gg', 'fb' ] }
{ name: 'Bob', jobIds: [ 'ms' ] }
{ name: 'Charlie', jobIds: [] }

Обратите внимание, что у Чарли нет приложений.

Мой текущий код:

UserInfo.aggregate([
  {
    $lookup: {
      from: 'applications',
      let: { userId: '$_id' },
      pipeline: [
        {
          $match: {
            $expr: { $eq: ['$userId', '$$userId'] }
          }
        },
        {
          $project: { jobId: 1, _id: 0 }
        }
      ],
      as: 'jobIds'
    }
  }
])

Я получил:

{ _id: '1', name: 'Alice', jobIds: [ { jobId: 'gg' }, { jobId: 'fb' } ] }
{ _id: '2', name: 'Bob', jobIds: [ { jobId: 'ms' } ] }
{ _id: '3', name: 'Charlie', jobIds: [] }

Как получить jobIds: [ 'gg', 'fb' ] вместо jobIds: [ { jobId: 'gg' }, { jobId: 'fb' } ]?

Не нашел правильного пути в АгрегацияЭтапы трубопровода .

1 Ответ

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

Использование $addFields ступень в конце трубопровода.

UserInfo.aggregate([
  { "$lookup": {
    "from": "applications",
    "let": { "userId": '$_id' },
    "pipeline": [
      { "$match": { "$expr": { "$eq": ["$userId", "$$userId"] }}},
      { "$project": { "jobId": 1, "_id": 0 }}
    ],
    "as": "jobIds"
  }},
  { "$addFields": { "jobIds": "$jobIds.jobId" }}
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...