我正在查询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转换为电子邮件)?
亲切的问候
答案 0 :(得分:0)
上面的代码有效,但是最后我意识到作者的电子邮件几乎永远不会被更新。因此,我最终使用firebase实时数据库触发器在创建时将电子邮件地址推送到便笺。用户无法阅读该电子邮件,并将其存储在其自己的子节点中。这消除了数据库查找的需要。