Firebase多路径更新只会覆盖假定的节点

时间:2017-07-02 07:33:33

标签: javascript 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 个答案:

答案 0 :(得分:1)

当您致电更新时,Firebase服务器:

  • 循环浏览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属性的值。