2017-07-02 35 views
1

在下面的代碼中,我試圖使用雲功能來將一些字段設置爲新值的多重更新,但它只是導致覆蓋每個節點。我不太瞭解這種行爲,因爲我只需要一個簡單的更新。Firebase多路徑更新只是覆蓋假設的節點

const functions = require('firebase-functions'); 
const admin = require('firebase-admin'); 
admin.initializeApp(functions.config().firebase); 


exports.onJobBid_Status = functions.database 
    .ref("/JobBids/{jobId}/{bidId}/status") 
    .onWrite((event) => { 

     let newStatus = event.data.val(); 

     let updates = {}; 
     updates["/Jobs/" + event.params.jobId] = { status: newStatus, }; 
     updates["/Users/" + event.params.bidId + "/JobBids/" + event.params.jobId] = { status: newStatus, level:"4", color:"green" }; 


     return admin.database().ref().update(updates); 

    }); 

回答

1

當你調用更新,在火力地堡服務器:

  • 遍歷updates的性能/路徑。
  • 對於每個屬性/路徑,執行set()操作。

因此,儘管你可以更新的具體路徑,在每個路徑的操作是有規律的set()。這意味着它會替換每個路徑下的數據。

解決方案是讓您的密鑰中的最低級屬性的整個路徑。所以你的情況:

let updates = {}; 
updates["/Jobs/" + event.params.jobId+"/status"] = newStatus; 
let jobPath = "/Users/" + event.params.bidId + "/JobBids/" + event.params.jobId; 
updates[jobPath+/status"] = newStatus; 
updates[jobPath+/level"] = "4"; // consider storing this as a number 
updates[jobPath+/color"] = "green" ; 

有了這些updates,你只會更換statuslevelcolor屬性的值。