ios - 高效查询大量 Firestore 文档并限制结果数量?

标签 ios swift firebase google-cloud-firestore

更多的是一个普遍问题,如何使用 Swift 查询 Firestore 中存储的数百甚至数千个文档,并将结果数量限制为某些金额(假设为 100)。

从 Firebase 文档中,我找到了 .limit(some_number) 函数,您可以将其附加到 .where 查询的末尾。问题在于,如果 some_number 为 100,那么它似乎只搜索 100 个文档,不会继续搜索直到获得 100 个结果。如果这些文档中的 100 个文档中只有 60 个与您要搜索的文档匹配,那么您将得到 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 值(如果玩家有麦克风则为 true)

平台是一个字符串(例如:“PS4”)

编辑 1:添加上下文代码

最佳答案

所以这不是一个具体的答案,而是更多的证明,包括错误检查 - 它可以帮助您找出代码中的错误位置。

我使用以下格式创建了一个包含 100 个用户的 FireStore

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 个结果。请记住,游戏值(value)为 1 的玩家恰好有 50 名。

因此这可能表明错误存在于代码的其他地方,或者 FireStore 属性的结构可能存在不一致。

关于ios - 高效查询大量 Firestore 文档并限制结果数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55700078/

相关文章:

ios - 我们如何在 3D 空间中同时旋转 2 个 UIView 平面

ios - 如何使用 Quartz 以 mmap() 方式对加密的 (AES-256) PDF 文件进行 "load"?

ios - 以编程方式显示导航栏的 UISearchController

firebase - 有没有办法修复将有天赋的聊天消息发送到 firestore 时 react native 上的 "Encountered two children with the same key"错误?

ios - 有没有可靠的方法来在2015年获取iOS设备的唯一标识符?

ios - CGAffineTransform 反转 : singular matrix Error

ios - SWIFT 单击按钮应用程序崩溃

ios - 如何使用调度组在类初始化时异步等待 Firebase 回调?

firebase - 在 React Native 中启用 Firebase debugView 事件

android - 将 Firebase Persistence Enabled 设置为 true 后无法检索新数据?