Агрегатный возврат данных Mongodb условно - PullRequest
1 голос
/ 23 января 2020

Я пытаюсь вернуть ТОЛЬКО записи данных, чья электронная почта не существует в другой коллекции с агрегацией mongodb. Пример:

LetterCollection:

[
  {
    "email": "some@email.com",
    "data": "someData"
  }, {
    "email": "some2@email.com",
    "data": "someData2"
  },
]

UserCollection:

[
  {
    "id": "1"
    "email": "some@email.com",
  }
]

Получить все письма, почтовые сообщения которых не существуют в коллекции пользователей. Ожидаемый результат:

[{
  "email": "some2@email.com",
  "data": "someData2"
}]

Как мне этого добиться?

1 Ответ

2 голосов
/ 23 января 2020

Запустите агрегирующую операцию для коллекции letters, в которой конвейер сначала выполняет $lookup для коллекции users, объединенной в поле email.

Документы, возвращаемые с этой стадии конвейера, содержат поле массива с присоединенными документами, поэтому вам потребуется дополнительный шаг конвейера $match, чтобы отфильтровать документы, если в этом новом поле нет документов. , Это можно сделать, проверив длину поля массива с помощью $size и отфильтровав с помощью выражения $expr с оператором сравнения $eq.

Результат может быть далее $project ed для удаления нового поля в тех документах, которые соответствуют конечному желаемому результату.

Вышеуказанный конвейер можно выразить как:

db.letters.aggregate([
    { '$lookup': {
        'from': 'users',
        'localField': 'email',
        'foreignField': 'email',
        'as': 'users'
    } },
    { '$match': { '$expr': { '$eq': [ { '$size': '$users' }, 0 ] }  } },
    { '$project': { 'users': 0 } }
])
...