【问题标题】:Firebase check data exist before insertFirebase 检查数据在插入之前是否存在
【发布时间】:2017-12-26 14:51:47
【问题描述】:

我在使用 Firebase 时遇到了一些问题。我想要做的是创建一个新的聊天室,如果它不存在,否则,获取现有的聊天室 ID。到目前为止,我取得的成就是:

数据库结构如下:

chatrooms 
    chatroomID
        participantID1 *(can be senderKey or recipientKey)*
        participantID2 *(can be senderKey or recipientKey)*
        latestMessage

我创建新聊天室的代码:

let promiseRoomKey = new Promise((resolve, reject) => {
        // need to perform check before insert new chatroom

        // create room for chat
        var roomKey = firebase.database().ref('chatrooms').push({
            [senderKey]: true,
            [recipientKey] : true
        }).getKey();

    resolve(roomKey);
    });

问题是在我创建新聊天室之前,我需要检查 senderKey 和 recipientKey 是否都存在于同一个聊天室中。如果他们两个都出现在同一个聊天室中,我会抓取聊天室 ID。如果没有,那么我将继续创建一个新的聊天室。

但我不知道如何实际检查 senderKey 和 recipientKey 是否出现在同一个聊天室中。有什么想法吗?

附言。现在请忽略 latestMessage 节点,因为它只是为了简化我的阅读目的。

谢谢!

【问题讨论】:

  • 使用 firebase 事务,您可以在继续操作之前检查数据库中的当前值。见firebase.google.com/docs/database/web/…
  • 通常当您想要确保一个值或值组合是唯一的时,请查看是否可以将该值/那些值放入键中。由于保证密钥在其集合中是唯一的,因此您的一半问题会自动解决。在这种情况下,您可以根据该房间参与者的 ID 确定聊天室 ID。见stackoverflow.com/questions/33540479/…
  • @FrankvanPuffelen 我明白了。但是我怎样才能真正将连接的字符串作为聊天室ID 推送呢?因为通过在firebase中使用push(),它会自动生成一个唯一的push ID,对吗?此外,通过将参与者 ID 连接为聊天室 ID,是连接他们唯一的推送帐户 ID 还是仅连接用户名本身更好?
  • 不要调用ref.push(...),而是使用ref.child(key).set(...)

标签: javascript firebase firebase-realtime-database


【解决方案1】:

好吧,IDK 如果它是一个很好的解决方案,但是您可以创建一个同时具有(发送者和接收者 ID)的聊天室 ID,因此您需要在数据库中搜索是否存在具有这两个 ID 的任何聊天室。

users
  id001:"User Name"
  id002:"User Name"
chatrooms
  id001id002
    id001
    id002
    latestMessage

要在数据库中只搜索一次,您可以对 id 进行排序,所以它总是首先是较低的 id,就像上面的示例一样。

【讨论】:

  • 抱歉,您的意思是通过连接两个用户 ID 创建聊天室 ID?另外,concat字符串后,如何实际检查房间是否存在?
  • 是的,只是连接它们。要检查只需使用firebase.database().ref('chatrooms/id001id002').once('value').then((snapshot) => { // check if snapshot.val() exists })
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-02
  • 1970-01-01
  • 1970-01-01
  • 2019-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多