MongoDB - сортировка по ссылке или по "внешнему ключу" (Liftweb, Scala)
У меня есть пользователь, который содержит справочное поле "o", которое указывает на организацию:
> db.users.findOne()
{
"o" : ObjectId("4ec3548544ae1b7234548826")
}
Организации содержат поле "n":
> db.organisations.findOne()
{
"n" : "My organization"
}
Я хочу, чтобы список пользователей сортировался по, желательно в Scala / Lift.
1 ответ
Решение
То, что вы фактически просите, - это СОЕДИНЕНИЕ. MongoDB не имеет понятия о присоединении.
С точки зрения сервера, коллекции просто не знают друг о друге. Некоторые инструменты абстрагируют это (например, Morphia), но на самом деле есть только два основных способа сделать это:
- Ручное соединение: загрузить
users
затем загрузитеorganizations
объединить их вместе и присоединиться к клиентской части. - Denormalize: сохранить копию поля N внутри
users
Коллекция (и держать его в синхронизации). Это сделает ваш запрос быстрым, но усложнит обновления.
Этот недостаток JOIN является одним из фундаментальных компромиссов MongoDB. Если это обычный запрос или важный запрос, вам нужно либо сделать № 1, № 2 или № 3: выбрать другую БД.