【问题标题】:How to push data into subcollections in firebase如何将数据推送到firebase中的子集合中
【发布时间】:2021-04-29 21:36:50
【问题描述】:

我正在使用 react-native 和 firebase 创建一个消息传递应用程序。它工作得很好。

现在我想通过创建私人聊天更进一步。据我了解,我需要将数据填充到子集合中。例如:chats>chatroom1>data、chats>chatroom2>data e.t.c

我目前正在使用此代码

从'firebase'导入firebase;

class Fire {
  constructor (props) {
    this.init()
    this.checkAuth()
  }

  init = () => {
    if (!firebase.apps.length) {

    }
  };

  checkAuth = () => {
    firebase.auth().onAuthStateChanged(user => {
      if (!user) {
        firebase.auth().signInAnonymously();
      }
    })
  } 

  send = messages  => {
    messages.forEach(item => {
      const message = {
        text: item.text,
        timestamp: firebase.database.ServerValue.TIMESTAMP,
        user: item.name 
      }

      this.db.push(message)
    })
  }  

  parse = message => {
    const {user, text, timestamp} = message.val();
    const {key, _id} = message
    const createdAt = new Date(timestamp)

    return {
      _id,
      createdAt,
      text,
      user
    }
  }

  get = callback => {
    this.db.on('child_added', snapshot => callback(this.parse(snapshot)))
  }

  off() {
    this.db.off()
  }

  get db() {
    return firebase.database().ref("messages");
  }

  get uid(){
    return(firebase.auth().currentUser || {}).uid
  }
} 

如何从这段代码中填充子集合?

我相信对于调用特定的子集合,firebase.database().ref("messages/chatroomid"); 可以解决问题,对吧?

我所说的子集合是这个

目前我的 JSON 树看起来像:

database
    - messages
         - mvhhsjsfurhcb
               - text: "hi"
                 timestamp: 9942313949
                 user: "David"

firebase.database().ref("messages"); calls out the data under messages 

这就是我想要的

 database
        - messages
               -chatroom1
                   - mvhhsjsfurhcb
                         - text: "hi"
                           timestamp: 9942313949
                           user: "David"
               -chatroom2
                   - mvhhsjsfurhcb
                         - text: "hey, this i room2"
                           timestamp: 9942313949
                           user: "Sam"

那么firebase.database().ref("messages/chatroom1"); 只呼出聊天室1 中的消息。

我打算用这个实现的是为用户创建一个私人聊天

为了让您更深入地了解,如果我要使用 PHP 来做这件事,我会做 SELECT * WHERE chatroom = :chatroom;

我相信答案将与this.db.push(message) 有关。可能添加另一个 '.' 表示在推送消息之前还有另一个分支

【问题讨论】:

  • Firebase 实时数据库没有集合的概念。相反,数据存储在一个大节点树中,也称为 JSON 树。你能澄清一下在这个上下文中你所说的“子集合”是什么意思吗?
  • 但是,如果您想从拥有单个消息列表转变为拥有多个带有消息的房间,您确实会在显示的 JSON 层次结构中添加一个带有房间 ID 的层。如果您正在寻找有关如何确定房间钥匙的想法。看看stackoverflow.com/questions/33540479/…
  • @FrankvanPuffelen 谢谢,我按照您的第一条评论中的要求编辑了问题
  • 这种结构看起来很适合多聊天室应用程序。对于用户之间的私人聊天,以及如何确保每个用户都能找到他们的聊天室,请参阅我之前提供的链接,因为它解决了这两个问题。
  • 我理解存储用户 ID 的想法......我现在的问题是,this.db.push(message) 推送到 datbase>messages>data。我如何让它推送到 database>messages>chatroomid>data。我不认为链接解决了这个问题。我已经习惯了 php 作为我的后端,如果我应该知道的话,我很抱歉。 @FrankvanPuffelen

标签: javascript firebase react-native firebase-realtime-database


【解决方案1】:

如果你想将聊天消息推送到特定的聊天室,你可以这样做:

  this.db.child("chatroomid1").push(message)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    • 2019-01-27
    • 2018-09-23
    相关资源
    最近更新 更多