更多的是一个一般性问题,如何使用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 :为上下文添加了代码
答案 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属性的结构可能不一致。