Давайте предположим, что это простое соотношение:
class Thing
belongs_to :user # Not embedded!
end
И это упрощенное агрегирование на Thing
, где мы хотим получить пользовательский объект:
{ :$match => { ... } },
# Get user from belongs_to relation
{ :$lookup => {
from: 'users',
localField: 'user_id',
foreignField: '_id',
# Always has one element, because it's a belongs_to relation
as: 'user'
} },
В агрегации существует два способа замены поля первым элементом массива.
- С
addFields
и arrayElemAt
:
{ :$addFields => { user: { :$arrayElemAt => ['$user', 0] } } }
- С
unwind
(предполагается, что один элемент в массиве):
{ :$unwind => { path: '$user' } }
Вопрос: Я предпочитаю unwind
, так как он выглядит чище, но видел, как люди часто используют первый подход. Это быстрее или «лучшая практика»?