如何在Firestore Swift中将特定字段的值分配给同一文档内的另一个字段?

时间:2020-07-23 20:51:29

标签: swift google-cloud-firestore

假设我在文档中有三个字段,分别为CountRatingAvgRating。现在,我更新文档,并说我为CountRating分配了一些值。我还想通过获取AvgRatingCount的值并将其除以更新Rating的值。现在的问题是如何在这里获取CountRating的值?

db.collection("ABC").document("XYZ").updateData([
    "Count" : 2,
    "Rating": 13,
    "AvgRating": "//Need help here, want something like value Of Rating / value of Rating"
]) 

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

您将无法自动执行此操作,必须先阅读文档,然后根据需要应用转换并编写结果文档。

Firestore客户端SDK支持某种Transactions,让您可以做到这一点

答案 1 :(得分:1)

要获得已经存在的值,必须在写入之前先阅读文档。

您有两个选择

(1)首先读取文档,然后在闭包中获取文档快照,读取值,然后在计算之后,在该闭包内更新文档数据。

(2)使用事务处理首先读取数据,然后更新数据。

我建议您使用事务处理,因为它可以一次性执行操作。 (第一种方法也可以在这里应用,而不必担心失败)

首先,创建一个文档引用,例如:

let db = Firestore.firestore()
let ref = db.collection("ABC").document("XYZ")

然后

db.runTransaction({ (transaction, errorPointer) -> Any? in

let document = DocumentSnapshot?
do
{
    document = try transaction.getDocument(ref)
} 
catch
{
    print(error)
    return nil
}
    
guard let data = document.data()
else
{
return nil
}

//you have document data here take the values

let count = data["Count"] as! Int
let rating = data["Rating"] as! Int

//perform the calculations

let average = rating / count

//and finally updating data like

transaction.updateData([
    "Count" : 2, //new count value
    "Rating": 13, //new rating value
    "AvgRating": average //calculated value
])

return nil

}) {
    (object, error) in
     if let error = error
     {
         print(error)
     }
}