Выборка новостей по заданным категориям. Firestore

swift

#1

нету идей как решить эту задачу правильно, цель - на экране должны отображаться только те новости, категории которых соответствуют выбранным пользователем (в модели юзера есть массив topic = [sport, business, money, article]).

Получается есть новость, например с полем topic = “sport”, и есть пользователь, который выбрал такую же категорию “sport”, как мне правильно составить запрос, чтобы это работало? Вот мой код:

func loadFirstData(page: Int, completion: @escaping ([NewsModel]?, Error?)-> Void) {
    
    self.getUserTopics { (userTopics) in //  получаю категории юзера
        if let topics = userTopics, !topics.isEmpty {
            // topics = три темы [politics, sport, money]
        }
    }
    
    // мой запрос, достаю news, сортирую по дате и далее просто передаю первые 10 новостей, здесь должно быть по идее так, достается news, сортируется по категориям, будут браться только категории из массива topics с метода getUserTopics, и сортироваться по дате

     database.collection(kCollectionNews).order(by: kQueryOrderFieldTimestamp, descending: true).limit(to: page).getDocuments(completion: { (snapshot, error) in
        if let error = error {
            completion(nil, error)
            return
        }

        if snapshot?.count ?? 0 < page {
            self.lastSnapshot = nil
        } else {
            self.lastSnapshot = snapshot?.documents.last
        }
        let news = (snapshot?.documents.compactMap( { NewsModel(dictionary: $0.data())} ))
        completion(news, nil)
    })
}

Проблема: пробовал обвернуть в массив, но получается что все первые новости одного типа и нельзя отсортировать по дате в запросе, как мне правильно это сделать? Вот мои попытки:

func loadFirstData(page: Int, completion: @escaping ([NewsModel]?, Error?)-> Void) {
    
    self.getUserTopics { (userTopics) in
        if let topics = userTopics, !topics.isEmpty {

            topics.forEach( {
                self.database.collection(kCollectionNews).whereField("topic", isEqualTo: $0).limit(to: page).getDocuments(completion: { (snapshot, error) in

                    if let error = error {
                        completion(nil, error)
                        return
                    }
                    
                    if snapshot?.count ?? 0 < page {
                        self.lastSnapshot = nil
                    } else {
                        self.lastSnapshot = snapshot?.documents.last
                    }
                    let news = snapshot?.documents.compactMap( { NewsModel(dictionary: $0.data()) })
                    completion(news, nil)
                })
            })
        }
    }

}