Swift和Cloud Firestore事务 - getDocuments?

时间:2018-06-06 22:53:14

标签: swift firebase google-cloud-firestore

Cloud Firestore中的事务支持使用transaction.getDocument获取文档,但即使存在.getDocuments方法,也似乎没有.getDocuments来获取与事务一起使用的多个文档。

我有一个类似Yelp的应用程序,使用具有以下结构的Cloud Firestore数据库: - 评价地点称为点。 - 每个点在斑点集合中都有一个文档(由唯一的文档ID标识)。 - 每个地点都有一个评论集合,其中包含该地点的所有评论。 - 每个审核都由其自己的唯一文档ID标识,每个审核文档都包含该点的评级。

下面是我的Cloud Firestore设置的图片,其中包含一些数据。 enter image description here

我已经尝试创建一个交易来获取现场所有评论的数据,希望我可以对平均评论进行更新计算。将其保存回现场文档的属性。我尝试过使用:

let db = Firestore.firestore()
db.runTransaction({ (transaction, errorPointer) -> Any? in
    let ref = db.collection("spots").document(self.documentID).collection("reviews")
    guard let document = try? transaction.getDocuments(ref) else {
        print("*** ERROR trying to get document for ref = \(ref)")
        return nil
    }

...

Xcode声明: “交易”类型的值没有成员“getDocuments”。 有一个getDocument,可用于获取单个文档(请参阅https://firebase.google.com/docs/firestore/manage-data/transactions)。

是否可以在交易中获取文档集合?我想这样做是因为我评级(现场)的每个地方都有一个averageRating,每当有一个等级更改时,我想调用一个函数: - 开始交易(完成) - 读取该地点的所有当前评论(无法开始工作) - 计算新的averageRating - 使用新的averageRating值更新现货。

我知道Google的FriendlyEats使用的技术是将每个更改应用于当前的平均评级值,但我更倾向于对每次更改进行精确的重新计算以保持数值精度(即使它附加查询会有点贵。 谢谢你的建议。

1 个答案:

答案 0 :(得分:3)

  1. 否。客户端库不允许您在事务内部进行查询。您只能在查询中请求特定的文档。您可以做一些真正令人讨厌的事情,例如在事务外部运行查询,然后在事务内部请求每个单独的文档,但是我不建议这样做。

  2. 可能更好的方法是在服务器端运行它。就像使用Cloud Function一样,它确实允许您在事务内部运行查询。更重要的是,您不再需要委托客户来更新餐厅的平均评价得分,这是一件不好的事情。

  3. 这就是说,我仍然建议您使用Cloud功能,该功能执行与Friendly Eats相同的逻辑,在这种情况下,您可以像New average = Old average + new review / (Total number of reviews)这样说。如果您的应用程序非常受欢迎,则不会执行过多的读取操作。