Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 高效地查询大量Firestore文档并限制结果数量?_Ios_Swift_Firebase_Google Cloud Firestore - Fatal编程技术网

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

Ios 高效地查询大量Firestore文档并限制结果数量?,ios,swift,firebase,google-cloud-firestore,Ios,Swift,Firebase,Google Cloud Firestore,更一般的问题是,如何使用Swift查询存储在Firestore中的数百甚至数千个文档,并将结果数量限制在某个数量(比如100个) 从Firebase文档中,我找到了.limit(some_number)函数,您可以将该函数附加到.where查询的末尾。问题是,如果某个_编号为100,则它似乎只搜索100个文档,而不是一直搜索,直到得到100个结果。如果100个文档中只有60个匹配您正在搜索的内容,那么您将得到60个,而不是继续搜索,直到您得到100个 我错过什么了吗 对于上下文,在我的例子中,我

更一般的问题是,如何使用
Swift
查询存储在
Firestore
中的数百甚至数千个文档,并将结果数量限制在某个数量(比如100个)

从Firebase文档中,我找到了
.limit(some_number)
函数,您可以将该函数附加到
.where
查询的末尾。问题是,如果某个_编号为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”)

麦克风是一个布尔(如果玩家有麦克风,那么它是真的)

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


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

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


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

因此,这不是一个明确的答案,而是一个包含错误检查的证据-它可能帮助您发现代码中的错误所在

我创建了一个FireStore,有100个用户,格式如下

uid_0
    gameValue: "1" //or "0"
    micValue: "1"
    platformValue: "1"
    rankValue: "1"
其中50名用户的gameValue设置为“0”,另50名用户的gameValue设置为“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名玩家的游戏值为1


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

这不是它应该工作的方式。如果看不到您的查询,也不了解您试图查询的数据,就不可能真正说出这里发生了什么。@DougStevenson我用我的查询更新了我的问题,我想查询什么数据。因此,我的案例中有一个名为“用户”的集合,其中包含用户文档。所有的用户文档都有他们玩的游戏(我的应用程序为人们查找队友)。如果我使用.where(playsGame,isEqualTo:true)进行查询,那么我将返回10个测试文档中的5个,这意味着集合中有5个用户在玩特定的游戏。当我在该查询的末尾添加.limit(5)时,我只返回了3个文档。巧合的是,在收藏的前5个用户文档中,只有3个玩这个游戏。因此,在我看来,它似乎只搜索有限数量的文档。这不是查询应该如何工作的,我在实践中也从未见过这种情况。当然,SDK或服务器端的某个地方总是可能存在bug。你能不能用更少的字段和文档来重现这个问题,这样我们就可以在本地重现它?我会做一个更小的演示,看看我能不能重现它。不幸的是,也许要到明天才能开始。如果我可以复制它,我将发布另一条评论。我知道这不是他们应该做的,这就是为什么我会发疯,想知道为什么这不起作用。这只是其中的一天,hahaThanks@Jay,我正在使用Firestore,但这个解决方案对我没有帮助。请检查我的代码,并建议我如何解决这个问题。非常感谢。