MongoDB $ in с подзапросом

Aug 25 2020

У меня есть этот набор коллекции ниже ..

Сбор команд:

{
   total: 3
   data: [
      {
         "_id": "t1",
         "name": "white horse",
         "leader_id": "L1"
         "teamScore": 12,
         "active": 1
      },
      {
         "_id": "t2",
         "name": "green hornets",
         "leader_id": "L2",
         "teamScore": 9,
         "active": 1
      },
      {
         "_id": "t3",
         "name": "pink flaminggo",
         "leader_id": "L3",
         "teamScore": 22,
         "active": 1
      },
   ]
}

Коллекция лидеров:

{
   total: 3
   data: [
      {
         "_id": "L1",
         "name": "John Doe",
         "organization": "Software Development",
         "active": 1
      },
      {
         "_id": "L2",
         "name": "Peter Piper",
         "organization": "Software Development"
         "active": 1
      },
      {
         "_id": "L3",
         "name": "Mary Lamb",
         "organization": "Accounting Department"
         "active": 1
      },
   ]
}

Запрос должен выглядеть так: SELECT * FROM teams WHERE active = 1 AND leader_id IN (SELECT id FROM leaders WHERE organization = 'Software Development')

Я новичок в mongodb, и мой вопрос в том, как можно преобразовать приведенный выше запрос в структуру агрегации mongoDB?

Ответы

1 turivishal Aug 25 2020 at 14:27

Вы можете использовать $ lookup с конвейером,

  • $matchпроверит activeстатус
  • $lookup присоединится к коллекции лидеров
    • $matchпроверить leader_idиorganization
  • $matchчек лидеров не []пуст
  • $projectудалить leadersполе
db.teams.aggregate([
  { $match: { active: 1 } }, { $lookup: {
      from: "leaders",
      let: { leader_id: "$leader_id" }, as: "leaders", pipeline: [ { $match: {
            $and: [ { $expr: { $eq: ["$_id", "$$leader_id"] } }, { organization: "Software Development" } ] } } ] } }, { $match: { leaders: { $ne: [] } } }, { $project: { leaders: 0 } }
])

Игровая площадка