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,但这个解决方案对我没有帮助。请检查我的代码,并建议我如何解决这个问题。非常感谢。