Внешнее соединение в mongodb с использованием $ lookup - PullRequest
0 голосов
/ 31 августа 2018

У меня есть Каналы коллекция

{
  channel: "Xamper",  //unique
  subscribers: [
    ObjectId("5a934e000102030405000000"),
    ObjectId("5a934e000102030405000001"),
    ObjectId("5a934e000102030405000002")
  ]
}

А Пользователи Коллекция

{
  _id: ObjectId("5a934e000102030405000000"),
  name: "Bradman"
},
{
  _id: ObjectId("5a934e000102030405000001"),
  name: "Hartin"
},
{
  _id: ObjectId("5a934e000102030405000002"),
  name: "Migra"
},
{
  _id: ObjectId("5a934e000102030405000004"),
  name: "Polycor"
}

Теперь мне нужно найти с Канал имя "Xamper" и подсчитать пользователей, которых нет в subscribers массиве

Таким образом, вывод будет

{
  channel: "Xamper",
  unSubscribers: 1
}

Что похоже на внешнее исключающее соединение SQL

enter image description here

1 Ответ

0 голосов
/ 31 августа 2018

Вы можете использовать ниже конвейера в 3.6.

$lookup с конвейером для присоединения коллекции Channels к коллекции Users на подписчиках

$count с $not $in, чтобы сравнить подписчиков с каждым идентификатором в коллекции Users и вывести количество не найденных документов.

$project для проецирования выходных полей.

db.Channels.aggregate([
  { "$lookup":  {
    "from": "Users",
    "let": { "subscribers": "$subscribers" },
    "pipeline": [
      { "$match": { "$expr": { "$not": { "$in": [ "$_id", "$$subscribers" ] }}}},
      { "$count": "count" }
    ],
    "as": "lookupresult"
  }},
  { "$project": {
    "channel":  1,
    "unSubscribers": { "$arrayElemAt": [ "$lookupresult.count", 0 ] }
  }}
])
...