Swift 和 Cloud Firestore 事务 - getDocuments?
Posted
技术标签:
【中文标题】Swift 和 Cloud Firestore 事务 - getDocuments?【英文标题】:Swift and Cloud Firestore Transactions - getDocuments? 【发布时间】:2018-11-16 17:57:29 【问题描述】:Cloud Firestore 中的事务支持使用 transaction.getDocument 获取文档,但即使有 .getDocuments 方法,似乎也没有用于获取与事务一起使用的多个文档的 .getDocuments。
我有一个类似 Yelp 的应用程序,它使用具有以下结构的 Cloud Firestore 数据库: - 评价的地方称为点。 - 每个点在点集合中都有一个文档(由唯一的 documentID 标识)。 - 每个地点都可以有一个评论集合,其中包含该地点的所有评论。 - 每条评论都由自己唯一的documentID标识,每条评论文档都包含一个现场评分。
下面是我的 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 使用一种技术,每次更改都应用于当前的平均评分值,但我更愿意对每次更改进行精确的重新计算以保持数值精度(即使它有点贵 w /附加查询)。 感谢您的建议。
【问题讨论】:
您不能只在要单独交易的每个文档上使用 getDocument() 吗? 每个“spot”文档中都有一个“reviews”集合。如果对单个评论进行了更改,我想获取所有评论,计算新的averageRating,然后将新的averageRating 保存到“点”。 然后您将不得不查询所有评论文件并单独处理它们。您不能仅使用集合 ID 进行交易。 【参考方案1】:没有。客户端库不允许您在事务内部进行查询。您只能在查询中请求特定文档。你可以做一些非常hacky的事情,比如在事务之外运行查询,然后在事务中请求每个单独的文档,但我不建议这样做。
最好在服务器端运行它。比如说,使用云函数,它允许您在事务中运行查询。更重要的是,您不再需要相信客户会更新餐厅的平均评分,这是一件坏事。
也就是说,我仍然可能建议使用 Cloud Function,它执行与 Friendly Eats 相同的逻辑,您可以在其中说出类似于 New average = Old average + new review / (Total number of reviews)
的内容,这将确保您没有执行如果您的应用程序变得非常受欢迎,则会过度阅读。
【讨论】:
以上是关于Swift 和 Cloud Firestore 事务 - getDocuments?的主要内容,如果未能解决你的问题,请参考以下文章
无法通过Cloud Functions(onCall)从Cloud Firestore返回一个json数组到Swift
Swift - Cloud Firestore 中的唯一 ID
如何从Swift中的Cloud FireStore Firebase访问特定字段
init() 中的 Swift Array.append 不能与 Firestore (Google Cloud/FIrebase) 结合使用
Firebase Firestore + Cloud Function 服务器端验证应用内购买收据(Swift + NodeJS)
在使用 Swift 的 iOS 应用程序中使用 DispatchQueue 等待数据从 Cloud Firestore 返回时遇到问题