有效查询大量Firestore文档并限制结果数量?

时间:2019-04-16 03:20:15

标签: 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是一个布尔值(如果玩家玩游戏,则其为真)

rankValue是一个字符串(例如:“ Gold 2”)

mic是个笨蛋(如果玩家拥有麦克风,则为true)

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

编辑1 :为上下文添加了代码

2 个答案:

答案 0 :(得分:0)

您似乎误解了Firestore查询的工作方式。您可以指定的限制是查询可以返回的最大文档数,而不是查询可以搜索的最大文档数。

如果在查询上使用limit(100),则查询将返回与查询匹配的前100个文档。如果少于100个匹配查询的文档,它将返回所有匹配项。

答案 1 :(得分:0)

因此,这不是专门的答案,而是更多包含错误检查的证明-它可以帮助您了解代码中错误的位置。

我创建了一个具有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个结果。请记住,有50位玩家的gameValue为1。

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