如何用Swift统计firebase中设备下的device0、device1等动态增加的文档?
我尝试了下面的代码,因为如果我能找到 1,如果我按顺序查找直到找不到它,我就可以获得总数,但它不起作用。(我没有找到我尝试过的女巫,但喜欢这个)
func checkDevice3Exists() {
let db = Firestore.firestore()
let clientDocRef = db.collection("devices").document("device3")
clientDocRef.getDocument { (document, error) in
if let document = document, document.exists {
let dataDescription = document.data().map(String.init(describing:)) ?? "nil"
print("Document data: \(dataDescription)")
if dataDescription.contains("\"device3\"") {
print ("field exists")
} else {
print("field doesnt exist") }
} else {
print("Document does not exist")
}
我尝试了以下其中一项
func countDevices(completion: @escaping (Int) -> Void) {
let db = Firestore.firestore()
db.collection("devices").getDocuments { (querySnapshot, error) in
if let error = error {
print("Error getting documents: \(error)")
completion(0)
} else {
let deviceCount = querySnapshot?.documents.count ?? 0
completion(deviceCount)
}
}
}
// i call with below code
countDevices { deviceCount in
print("Total: \(deviceCount)")
}
代码的固有问题是,随着集合的扩展,这
.getDocuments { (querySnapshot, error)
会返回越来越多的文档,最终导致设备超载并因数据量而崩溃。
@puf-FrankvanPuffelen 在问题评论中的链接是正确的解决方案
https://firebase.google.com/docs/firestore/query-data/aggregation-queries#swift_1
简而言之,使用计数聚合函数来检索集合的计数(来自文档):
let query = db.collection("cities")
let countQuery = query.count
do {
let snapshot = try await countQuery.getAggregation(source: .server)
print(snapshot.count)
} catch {
print(error)
}
上面的 try/await 是异步工作的。
但是,如果您不想使用方便的聚合函数,另一种选择是将文档计数存储在单独的集合中。
添加/删除文档时,递增/递减计数器。然后阅读该文件以揭示计数。