MongoDB使用嵌套数组聚合查找

时间:2019-01-31 21:27:35

标签: mongodb aggregation-framework

我要“加入”一个复杂的结构。

描述它的最好方法是,我将“收藏团队”作为名称/ ID的数组与用户一起存储-但是它们存储在嵌套对象中。我想返回用户“团队最喜欢的团队”。

这是数据模型

PLAYERS
{
    _id:
    team_id:
    name:
    position:
}


TEAMS
{   
    _id:
    name:
}


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

我有一个来自user.favs.teams的团队ID数组-我想要的是带有其团队名称的球员。

这是我正在使用的当前汇总-正在返回玩家但不返回团队...我很确定我需要放松一下,或者类似。

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 :(得分:1)

$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中的新更改。