Firebase转换值/外键查找

时间:2019-07-12 18:49:00

标签: javascript firebase-realtime-database

我正在查询Firebase数据库,需要将用户uid转换为电子邮件地址。这将代表SQL中的外键。我的数据结构如下。

{
  "notes" : {
    "-LOs0Ikx4ydM5RatREM1" : {
      "data" : {
        "dueDate" : 1561629600000,
        "title" : "First "
      },
      "members" : {
        "author" : "1212121212121212121212121212"
      }
    }
  },
  "users" : {
    "1212121212121212121212121212" : {
        "name" : "Mickey M",
        "email" : "mmouse@dis.com"
    }
  }
}

我希望首先获取“笔记”,然后进行查找以获取作者的电子邮件地址。

  let notes=  []
  const now = moment().valueOf()
  const notesRef = database.ref('notes/')
  .orderByChild('data/dueDate')
  .endAt(now)
  .once('value', (snapshot) => {
    //Collect all notes
    snapshot.forEach( (data) => { 
      notes.push(data.val())
    })
  }).then( () => {
    for (var i = 0; i < notes.length; i++) {
      //Get author email
      note= notes[i]
      const uid = (note.members) ? note.members.author : ''

      //This gets logged for every note
      console.log('note:', note.data.title, uid)

      const usersRef = database.ref(`users/${uid}/email/`)
      .once('value', (snapshot) => {
        if(snapshot.exists()){
          const email = snapshot.val()
          console.log('Author found', note.data.title, uid, email)
        }else{
          console.log('Author missing', note.data.title, uid)
        }
      })
    }
    return true
  }).catch((error) => {
    return error
  })

上面的代码确实有效-但我怀疑这种方法可能是一种反模式?我不希望对firebase进行过多的调用。

这可以更有效地完成吗? 在firtebase中将参考值/等效转换为外键的推荐方法是什么(在本例中为uid转换为电子邮件)?

亲切的问候

1 个答案:

答案 0 :(得分:0)

上面的代码有效,但是最后我意识到作者的电子邮件几乎永远不会被更新。因此,我最终使用firebase实时数据库触发器在创建时将电子邮件地址推送到便笺。用户无法阅读该电子邮件,并将其存储在其自己的子节点中。这消除了数据库查找的需要。