更多的是一个普遍问题,如何使用 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/