值在firebase数据库中被覆盖

时间:2018-03-16 11:14:32

标签: javascript firebase firebase-realtime-database

我正在制作聊天应用并将消息存储在firebase中,这是我的结构:

{
 "1405093" : {
 "172341" : {
  "bot" : {
    "msg" : [ {
      "msg" : "hi",
      "timestamp" : "12:09:02"
    }, {
      "msg" : "bye",
      "timestamp" : "12:11:03"
    } ]
  },
  "consultant" : {
    "msg" : "Hi"
  },
  "resolved" : false,
  "user" : {
    "module" : "",
    "msg" : [ {
      "msg" : "hi",
      "timestamp" : "12:09:01"
    }, {
      "msg" : "bye",
      "timestamp" : "12:11:01"
    } ]
  }
},
"172351" : {
  "bot" : {
    "msg" : [ {
      "msg" : "hi",
      "timestamp" : "12:09:02"
    }, {
      "msg" : "bye",
      "timestamp" : "12:11:03"
    } ]
  },
  "consultant" : {
    "msg" : "Hi"
  },
  "resolved" : true,
  "user" : {
    "module" : "",
    "msg" : [ {
      "msg" : "hi",
      "timestamp" : "12:09:01"
    }, {
      "msg" : "bye",
      "timestamp" : "12:11:01"
    } ]
  }
}}

这是我的代码

if(method === "addUser&Bot")
{
    umsg=data.umsg;
    bmsg=data.bmsg;
    ref.child(user+"/"+ticket_id).set({
        "user":{
            "msg":umsg,
            "module":""
        },
        "bot":{
             "msg":bmsg
        },
        "consultant":{
            "msg":"Hi"
        },
        "resolved":false
    });
    data={"name":user,"id":ticket_id}
    res.json(data);
}

正如你可以看到我使用set功能这是因为像172341这样的字段实际上是ticket_no,它总是唯一的,我不想创建随机生成的值通过firebase。所以问题是,当ticket_no是新的时,第一次这很好用,但是当我再次发送消息时,先前的消息被覆盖。那么如何编写处理新的ticket_no和消息的代码以及之后发送的消息。

1 个答案:

答案 0 :(得分:0)

如果您只想更新传递给数据库的值,并保留未经修改的任何内容,请使用update(...)代替set(...)

ref.child(user+"/"+ticket_id).update({
    "user":{
        "msg":umsg,
        "module":""
    },
    "bot":{
         "msg":bmsg
    },
    "consultant":{
        "msg":"Hi"
    },
    "resolved":false
});

这只会写出userbotconsultantresolved属性,并且不会修改任何其他属性。但它会覆盖userbotconsultantresolved属性的完整值。如果要进行深度更新,可以指定要更新的内容的精确路径:

ref.child(user+"/"+ticket_id).update({
    "user/msg": umsg,
    "user/module": "",
    "bot/msg": bmsg,
    "consultant/msg": "Hi",
    "resolved":false
});

这最后一个语句只会写入/更新指定的精确路径,并保留其他所有未修改的路径。