MongoDB агрегатный поиск с вложенным массивом - PullRequest
0 голосов
/ 01 февраля 2019

У меня сложная структура, к которой я пытаюсь «присоединиться».

Лучший способ описать это - у меня есть «Избранные команды», которые хранятся у пользователя в виде массива имен / идентификаторов - однакоони хранятся во вложенном объекте.Я хочу вернуть пользователям любимые команды игроков с командой.

Вот модели данных

PLAYERS
{
    _id:
    team_id:
    name:
    position:
}


TEAMS
{   
    _id:
    name:
}


USER
{
    _id:
    name:
    favs: {
        mascots: [{
            _id:
            name:       
        }],
        teams: [{
            _id:
            name:       
        }],
    }
}

У меня есть массив идентификаторов команд от user.favs.teams - и чтоЯ хочу вернуть игроков с названием их команды.

Это текущая агрегация, которую я использую - она ​​возвращает игроков, а не команды ... Я почти уверен, что мне нужно раскрутить или что-то подобное.

players.aggregate([
    {
        $match: {
            team_id: {
                $in: [--array of team ID's--]
            }
        }
    },
    {
        $lookup: {
            from: 'teams',
            localField: 'team_id',
            foreignField: '_id',
            as: 'players_team'
        }
    },
    {
        $project: {
            _id: 1,
            name: 1,
            position: 1,
            'players_team[0].name': 1
        }
    }
])

Что я получаю обратно ...

_id: 5c1b37b6fd15241940b11111
name:"Bob"
position:"Test"
team_id:5c1b37b6fd15241940b441dd
player_team:[   
    _id:5c1b37b6fd15241940b441dd
    name:"Team A"
    ...other fields...
]

Что я хочу вернуть ...

_id: 5c1b37b6fd15241940b11111
name:"Bob"
position:"Test"
team_id:5c1b37b6fd15241940b441dd
player_team: "Team A"

1 Ответ

0 голосов
/ 01 февраля 2019

Использовать ниже $ lookup (Aggregation)

db.players.aggregate([
  {
    $lookup: {
      from: "teams",
      let: { teamId: "$team_id" },
      pipeline: [
        {
          $match: { $expr: { $eq: [ "$_id", "$$teamId" ] } }
        },
        {
          $project: {  _id: 0 }
        }
      ],
      as: "players_team"
    }
  },
  {
    "$replaceRoot": {
      "newRoot": {
        "$mergeObjects": [
          {
            "_id": "$_id",
            "name": "$name",
            "position": "$position",
            "team_id": "$team_id"
          },
          {
            player_team: { $arrayElemAt: [ "$players_team.name", 0 ] }
          }
        ]
      }
    }
  }
])

Извините, если ваша версия MongoDB меньше 3,6.Из-за новых изменений в MongoDB 3.6.

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