Swift和Cloud Firestore交易 - getDocuments?

3
在Cloud Firestore中,事务支持使用transaction.getDocument获取文档,但即使有.getDocuments方法,似乎也没有一个可以与事务一起使用以获取多个文档的.getDocuments方法。
我有一个类似于Yelp的应用程序,使用Cloud Firestore数据库,具有以下结构: - 要评分的地点称为spots。 - 每个spot在spots集合中都有一个文档(由唯一的documentID标识)。 - 每个spot可以有一个包含该spot所有评论的reviews集合。 - 每个评论都由其自己的唯一documentID标识,并且每个评论文档都包含该spot的评分。
下面是我的Cloud Firestore设置的图像,其中包含一些数据。 enter image description here 我尝试创建一个事务,获取一个spot中所有评论的数据,希望我可以对平均评论进行更新计算,并将其保存回spot文档的属性中。我尝试使用:
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报错信息: 类型“Transaction”没有成员“getDocuments”。 有一个“getDocument”可以用来获取单个文档(请参见https://firebase.google.com/docs/firestore/manage-data/transactions)。
在事务中是否可能获取一组文档?我想这样做是因为我正在对每个地点进行评级(spot),并且每当其中一个评级发生更改时,我都希望调用一个函数: - 开始一个事务(已完成) - 读入该地点的所有当前评论(无法工作) - 计算新的平均评分 - 使用新的averageRating值更新该地点。
我知道Google的FriendlyEats使用的技术是将每个更改应用于当前平均评级值,但我更喜欢在每次更改时进行精确重新计算以保持数值精度(即使需要额外的查询也可以)。感谢您的建议。

你不能只是在每个你想单独处理的文档上使用 getDocument() 吗? - undefined
每个“spot”文档中都有一个“reviews”集合。如果对单个评论进行了更改,我想获取所有评论,计算新的平均评分,然后将新的平均评分保存到该“spot”。 - undefined
然后,您将需要查询所有评论文档并逐个进行操作。您不能仅通过集合 ID 进行操作。 - undefined
1个回答

6
  1. 客户端库不允许您在事务内部进行查询。您只能在查询中请求特定文档。您可以尝试某些hacky的方法,例如在事务外部运行查询,然后在事务内部请求每个单独的文档,但我不建议这样做。

  2. 更好的方法是在服务器端运行此操作。例如,使用Cloud Function,它允许您在事务内运行查询。更重要的是,您不再需要信任客户端更新餐厅的平均评分,这是一个坏习惯。

  3. 话虽如此,我仍然建议使用类似Friendly Eats的Cloud Function执行一些逻辑,例如新平均值=旧平均值+新评价/(总评价数)。如果您的应用程序变得非常受欢迎,它将确保您不会执行过多的读取操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接