云FireStore中的事务支持使用transaction.getdocument获取文档,但即使有.getdocuments方法,似乎也没有.getdocuments用于获取与事务一起工作的多个文档。
我有一个类似Yelp的应用程序,使用具有以下结构的云FireStore数据库:
-评价的地方叫做景点。
-每个spot在spots集合中都有一个文档(由唯一的documentid标识)。
-每个地点都可以有一个包含该地点所有评论的评论集合。
-每个评审都由其自己唯一的documentid标识,每个评审文档都包含一个现场评级。
下面是我的云端firestore设置的图片,其中包含一些数据。
swift - Swift和Cloud Firestore交易-getDocuments?-LMLPHP
我试着创建一个事务,获取一个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”。
有一个get document,可以用来获取单个文档(请参见https://firebase.google.com/docs/firestore/manage-data/transactions)。
在一次交易中有可能得到一系列文件吗?我之所以要这样做,是因为我评级的每个地方(点)都有一个平均值,每当其中一个评级发生变化时,我都想调用一个函数:
-启动事务(完成)
-阅读该站点的所有当前评论(无法开始工作)
-计算新的平均值
-用新的平均值更新点。
我知道google的friendlyeats使用了一种技术,每次更改都应用于当前的平均评分值,但我更愿意对每次更改进行精确的重新计算,以保持数值精度(即使使用额外的查询会更贵一点)。
谢谢你的建议。

最佳答案

不。客户端库不允许您在事务内部进行查询。只能在查询中请求特定文档。您可以做一些非常棘手的事情,比如在事务外部运行查询,然后请求事务内部的每个单独文档,但我不建议这样做。
最好是在服务器端运行它。比如说,使用云函数,它允许您在事务中运行查询。更重要的是,你不再需要信任客户来更新餐馆的平均评分,这是一件坏事。
也就是说,我还是建议使用一个云函数,它的逻辑与Friendly Eats的逻辑相同,在这里,你可以按照New average = Old average + new review / (Total number of reviews)的思路说一些话,如果你的应用程序变得非常流行,它将确保你不会执行过多的读取。

08-04 14:43