Перевод типичного запроса на объединение SQL в Firestore Firebase - PullRequest
0 голосов
/ 02 апреля 2020

Я начал работать с Firebase's Firestore в базовом c iOS приложении. Допустим, это приложение хотело помочь пользователям найти новые песни для прослушивания. Новые песни классифицируются как песни, которые пользователю еще не «понравились».

Контекст : Поиск новых песен Страница

Запрос : Поиск все песни, которые пользователю не «нравились» раньше

В SQL / реляционной базе данных у нас могло бы быть следующее:

Song
    id
    name
    artist_name

Like
    user_id
    song_id
    created_at

Используя это, мы могли бы затем выполнить следующий запрос к найти список песен, которые пользователю еще не понравились. (Да, это может быть полностью оптимизировано, но не в этом дело!)

SELECT * FROM Song where id NOT IN (SELECT song_id FROM Like where user_id = BLAH) // OR
SELECT Song.* FROM Song, Like where Like.user_id = BLAH AND Song.id != Like.song_id // etc

Итак, я создал похожую схему в Firestore:

/songs/1234 {
    "name": "Never going to give you up",
    "artist_name": "Rick Astley"
}

/likes/abcd {
    "song_id": "1234",
    "created_at": "blah" 
}

Проблема в том, что вы можете только запрашивать по одной коллекции за раз, и я бы предпочел не выполнять запрос, чтобы собрать весь список лайков пользователя, прежде чем запрашивать песни, поскольку пользователю уже могли понравиться 10 тыс. песен. Чтобы было ясно, это не является необоснованным предположением для реального варианта использования.

Я что-то упустил? Как лучше всего запросить список песен, которые данному пользователю еще не понравились?

...