Vas*_*rov 3 swift algolia google-cloud-firestore
这是我在尝试将地理位置与 Firestore 混合使用时遇到的一个问题。长话短说 - 我需要用户所在位置附近的餐馆。为了完成地理搜索,我使用 Algolia。当我向 Algolia 发出请求时,它会返回一组唯一的餐厅 ID,这些 ID 对应于 Firestore 文档 ID。这很好用。
让事情变得复杂的是我还需要两个条件 - 我需要将查询限制为平均评分 >= 8 的餐厅。而且我还想限制返回文档的数量(2、5、20 等)。
所以它在伪代码中应该是这样的:
db.restaurantsCollection
.documentIds([111, 222, 333, 444, 555, 666, 777, 888, 999])
.whereField("averageRating", isGreaterThanOrEqualTo: 8)
.order(by: "averageRating", descending: true)
.limit(to: 2)
.getDocuments()
Run Code Online (Sandbox Code Playgroud)
我知道截至今天 Firestore 不支持具有多个文档 ID 的查询。那么执行此类查询的最优化方法是什么?
如果我将 设为文档中的documentId一个id字段,然后迭代从 Algolia 返回的所有 id 并执行类似的操作(然后我可以在纯 Swift 中进行排序和限制):
for id in ids {
db.restaurantsCollection
.whereField("averageRating", isGreaterThanOrEqualTo: 8)
.whereField("id", isEqualTo: id)
.getDocuments()
}
Run Code Online (Sandbox Code Playgroud)
但这仍然意味着很多要求。还有其他想法吗?
这是一种更有效的方法:
firestoreDB
.collection("someCollection")
.whereField(FieldPath.documentID(), in: [
"05C0632C-601B-4D98-BD2B-3E809D0496B1", //up to 10 ids
"087686CA-6B21-4268-9E4C-CF833FCA92DE"
]).getDocuments { snap, error in
if let snap = snap {
snap.documents.forEach { print($0.data()) }
} else if let error = error {
print("Error: \(error)")
}
}
Run Code Online (Sandbox Code Playgroud)
将它们分成 10 个批次将允许排序(使用 .order(by: ) 等)。它并不完美,但看起来像是对您所拥有的的改进。您可以进行多个此类调用,并将结果合并为一个,然后对它们进行排序。
| 归档时间: |
|
| 查看次数: |
1806 次 |
| 最近记录: |