我一直在寻找建立特定请求的逻辑,但我并没有完全获得firebase的理念。这是我的数据结构:
`users:{
u1_id:{...}
u2_id:{...}
...
},
contacts:{
u1_id:{
contact1_id,
contact2_id,
...
}
}`
我的第一个选项是获取有关用户ID的数据的请求,第二个选项(实际的)是在他们添加时从联系人那里存储我需要的数据但是我需要运行每个用户的每个联系人的重大更新,似乎不是正确的解决方案。 (我已经检查了问题,firebase文档和视频)
我找到的最接近的解决方案是(来自他们的YouTube):
function getUserContacts(key, cb){
const rootRef = firebase.database().ref()
const contactsRef = rootRef.child('contacts')
const usersRef = rootRef.child('users')
contactsRef.child(key).on('child_added', snap => {
let userRef = usersRef.child(snap.key)
userRef.once('value', cb)
})
}
但它为用户提供1比1,而不是所有用户的对象
编辑:我的临时解决方案 - >
firebase.database().ref('users')
.on('value', snaps => {
firebase.database().ref(`contacts/${currentUser.uid}`)
.on('value', snapshot => {
let userContacts = []
snapshot.forEach(snapc => {
snaps.forEach(snapu => {
let duser = snapu
if(snapc.key == snapu.key)
{
userContacts.push(snapu.val())
}
})
})
dispatch({
type: CONTACTS_FETCH,
payload: userContacts
})
})
})
答案 0 :(得分:0)
问题仍然有点不清楚,但让我提出三个选择:
如果我们想要使用user_1的联系人填充列表,我们会按值读取用户联系人节点。在这种情况下,user_1有两个联系人; user_id2和user_id3
contacts
user_1
user_id2: true
user_id3: true
值也在父节点(user_1)中读取所有子数据。因为我们拥有整个数据节点(快照),所以我们可以遍历user_1的子值以获取每个user_idx(这是每个子节点的关键字)。当您遍历子项时,每个子项都会显示一个键,然后您可以在该特定用户节点中读取该键。
第二种选择是改变结构。
contacts
user_2
name: "John"
rank: "Captain"
contact_of: "user_1"
user_3
name: "William"
rank: "Second Officer"
contact_of: "user_1"
使用此结构,如果用户1想要加载其联系人,则在联系人节点上进行简单查询,其中contact_of =“user_1”。这将加载每个联系人及其所有数据。
当用户具有未共享的特定联系人时,此第二个示例有效。
如果多个用户可以拥有多个联系人,则可以选择其他选项。
contacts
user_2
name: "Jean Luc"
rank: "Captain"
contact_of
user_1: true
user_2: true
user_3
name: "William"
rank: "Second Officer"
contact_of:
user_1: true
user_2: true
在这种情况下,请在联系人节点上执行deep query,其中contact_of / user_1 = true,这将显示user_2和user_3 /