具有多个 id 的 iOS Firestore 复合查询

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)

但这仍然意味着很多要求。还有其他想法吗?

Adr*_*ian 6

这是一种更有效的方法:

    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: ) 等)。它并不完美,但看起来像是对您所拥有的的改进。您可以进行多个此类调用,并将结果合并为一个,然后对它们进行排序。