Пимонго: многократное отображение - PullRequest
0 голосов
/ 27 декабря 2011

У меня есть база данных, которая содержит данные альбомов и фотографий, альбом содержит несколько фотографий, и фотография также может содержаться в нескольких альбомах.

например)

**photo collection**
photo_id    album_ids
1           [11 12 13 14]
2           [11 12 15 16]
**album collection**
album_id    photo_ids
11          [1 2]
12          [1 6]

СейчасЯ хочу перечислить все фотографии, которые принадлежат одному пользователю (что означает несколько альбомов).Метод, который я могу найти, - это использовать вложенный цикл for, чтобы получить все фотографии, поместить их в список и отсортировать по номеру идентификатора (который подразумевает порядок времени).

for album in all the user's albums:
    get photos belonging to this album
        put it to global list
sort it

Есть лиЕсть ли более простые способы сделать это?

1 Ответ

1 голос
/ 27 декабря 2011

Не имея доступа к логике объединения, вам в основном нужно выполнить два запроса:

  1. Загрузить пользователя и получить список его альбомов.
  2. Запросить фотографии с идентификатором альбома в списке альбомов пользователя..

Это общий шаблон в MongoDB, когда у вас есть отношение многие ко многим.Если на сервере нет JOIN, вам нужно написать собственное объединение на клиенте.

Метод, который я могу выяснить, - это использовать вложенный цикл for, чтобы получить все фотографии и поместить их всписок и отсортировать его, используя номер идентификатора (который подразумевает порядок времени)

С имеющейся структурой это в основном все, что вы можете сделать.Также обратите внимание, что MongoDB ObjectId не монотонно увеличивается.Если вы собираетесь сортировать по идентификатору, это должен быть ваш собственный идентификатор.

Также обратите внимание, что вы можете создать индекс для photos в поле album_ids, чтобы сделать запрос быстрым.Однако, если вы планируете использовать .sort() и заставить сервер сортировать для вас, это поле должно быть частью того же индекса, иначе это приведет к ошибке.

...