Страницы

четверг, 10 декабря 2015 г.

MongoDB Many to Many

Всех, кто работает с MongoDB, поздравляю с релизом версии 3.2.0! Там столько вкусного, это просто праздник какой-то! Предлагаю провести дегустацию одной из самых вкусных, и наверняка самых ожидаемых, вкусняшек - оператора $lookup. Реализуем варианты запросов к коллекциям, которые находятся в отношениях "один ко многим" (left outer join) и "многие ко многим". По ходу используем еще один свежий оператор - $arrayElemAt, а также новые фичи оператора $unwind.


Для начала выполним инициализацию:

Коллекция test - целевые сущности, коллекция t - связи между документами коллекции test, t.b и t.c - внешние ключи на test.a.

Получаем связи с помощью оператора $lookup:

Один запрос! Я потрясен :).

Смапим значения поля d - полученные с помощью оператора $lookup документы коллекции t - оставим значение поля c - ключа связи с документом коллекции test:

Развинтим массивы (значения поля d):

Обращаю внимание на использование новых фич оператора $unwind - если развинтить "по-стариковски", тогда потеряем документ, у которого в качестве значения поля d пустой массив:

Заменяем ключи (значения поля d) на массив документов коллекции test с помощью все того же оператора $lookup:

Вытаскиваем из массивов (значения поля d) первый (и единственный) элемент с помощью оператора $arrayElemAt:

Группируем, сортируем:

Вуаля! Можно заново проектировать хранение данных и переписывать серверную часть :)