Эффективно запросить много документов Firestore и ограничить количество результатов? - PullRequest
0 голосов
/ 16 апреля 2019

Еще один общий вопрос: как можно использовать Swift для запроса сотен или даже тысяч документов, хранящихся в Firestore, и ограничить количество результатов до некоторой суммы (скажем, 100).

В документации Firebase я обнаружил функцию .limit(some_number), которую можно добавить к концу .where запроса.Проблема в том, что если some_number равен 100, то он, похоже, ищет только 100 документов, а не продолжает поиск, пока не получит 100 результатов.Если только 60 из 100 этих документов соответствуют тому, что вы искали, вы получаете 60 вместо продолжения поиска до 100.

Я что-то упустил?

ДляКонтекст, в моем случае у меня есть запрос, который выглядит следующим образом:

let db = Firestore.firestore().collection("users")

db.whereField(gameKey, isEqualTo: gameValue)
  .whereField(rank, isEqualTo: rankValue)
  .whereField(mic, isEqualTo: micValue)
  .whereField(platform, isEqualTo: platformValue)
  .limit(5)
  .getDocuments { (snapshot, error) in
    for document in (snapshot?.documents)! {
      print("Found a player that plays this game")
    }
  }

gameValue - это bool (если игрок играет в игру, тогда его значение true)

rankValue - это строка (например:«Gold 2»)

mic - это bool (если у игрока есть микрофон, то его значение истинно)

платформа - это строка (например: «PS4»)

Редактировать 1 : добавлен код для контекста

Ответы [ 2 ]

0 голосов
/ 16 апреля 2019

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

Я создал FireStore со 100 пользователями со следующимДля формата

uid_0
    gameValue: "1" //or "0"
    micValue: "1"
    platformValue: "1"
    rankValue: "1"

50 пользователей gameValue было установлено на «0», остальные 50 - на «1»

Затем я выполнил следующий фрагмент кода 10 раз.

func readGameData() {
    let usersColl = self.db.collection("users")
    let query = usersColl
        .whereField("gameValue", isEqualTo: "1")
        .whereField("rankValue", isEqualTo: "1")
        .whereField("micValue", isEqualTo: "1")
        .whereField("platformValue", isEqualTo: "1")
        .limit(to: 25)

    query.getDocuments { (querySnapshot, err) in
        if let err = err {
            print("Error getting documents: \(err)")
            return
        }
        if let snap = querySnapshot {
            if snap.count > 0 {
                for document in snap.documents {
                    let key = document.documentID
                    print("player: \(key) plays this game")
                }
            } else {
                print("no players play this game")
            }
        } else {
            print("no data returned")
        }
    }
}

Он ответил списком первых 25 игроков, которые соответствовали показанным критериям запроса.Затем я настроил параметр .limit на разные значения от 1 до 25 до 100, и он вернул 1 результат, затем 25 результатов, затем 50 результатов.Помня, что было ровно 50 игроков с gameValue, равным 1.

Так что это может указывать на то, что ошибка лежит в другом месте кода или, возможно, существует несогласованность в том, как структурированы свойства FireStore.

0 голосов
/ 16 апреля 2019

Вы, похоже, неправильно поняли, как работают запросы Firestore. Вы можете указать максимальное количество документов, которое запрос может вернуть , это не максимальное количество документов, которые он может искать.

Если вы используете limit(100) в запросе, запрос возвращает первые 100 документов, соответствующих запросу. Если запрос соответствует менее 100 документам, он вернет все совпадения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...