Я начал работать с 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 тыс. песен. Чтобы было ясно, это не является необоснованным предположением для реального варианта использования.
Я что-то упустил? Как лучше всего запросить список песен, которые данному пользователю еще не понравились?