繁体   English   中英

Swift和Cloud Firestore交易 - getDocuments?

[英]Swift and Cloud Firestore Transactions - getDocuments?

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

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

下面是我的Cloud Firestore设置的图片,其中包含一些数据。 在此输入图像描述

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

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 )。

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

我知道Google的FriendlyEats使用了一种技术,其中每个更改都应用于当前的平均评级值,但我更愿意对每次更改进行精确的重新计算,以保持数值精度(即使它更贵一些额外的查询)。 谢谢你的建议。

  1. 不可以。客户端库不允许您在事务内部进行查询。 您只能在查询中请求特定文档。 你可以做一些非常hacky的事情,比如在事务之外运行查询,然后请求事务中的每个单独的文档,但我不建议这样做。

  2. 可能更好的是在服务器端运行它。 比如说,使用Cloud Function,它允许您在事务中运行查询。 更重要的是,您不再需要信任客户更新餐厅的平均评价分数,这是一件坏事。

  3. 也就是说,我仍然可能会建议使用一个云函数,它具有一些与Friendly Eats相同的逻辑,你可以说New average = Old average + new review / (Total number of reviews)它会使如果您的应用真的很受欢迎,请确保您没有执行过多的阅读。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM