【发布时间】:2020-11-07 14:35:37
【问题描述】:
我正在使用具有以下结构的 Firebase 实时数据库。 我希望获取用户有权访问的所有“注释”并订阅这些注释中的更改。
notes: {
"noteId-1345" : {
"access" : {
"author": "1234567890"
"members": {
"1234567890": 0 <--- Author
"0987654321": 1 <--- Member
}
},
"data" : {
"title": "Hello",
"content": "Konichiwa!",
"comment": "123"
}
}
}
(我知道这种结构在理想情况下可以更平坦。:))
要获取用户有权访问的所有笔记 - 我在根目录中保留了一个额外的 user_notes 节点:
每当我将用户(members 的更新)与注释相关联时,我都会同时更新 /notes/$noteid 和 /user_notes/$uid。
user_notes: {
"$uid": {
"noteId-1345": {
myHide: false,
mySortOrder: 0,
title: "Hello"
}
}
}
在获取数据时,我希望订阅用户有权访问的所有笔记。
我首先获取用户有权访问的注释的 ID,然后附加侦听器以订阅每个 note 中的更新。
const uid = getState().auth.uid
let collectedNotes = {}
...
database.ref(`user_notes/${uid}`).on('value', (myAccessSnaps) => {
myAccessSnaps.forEach((accessSnap) => {
const noteId = accessSnap.key
const privateData = {'personalData': {...accessSnap.val()}}
database.ref(`notes/${noteId}`).on('value', (noteSnap)=>{
const notData = noteSnap.val()
const fullData = { ...privateData, ...notData }
const note = {
id: noteSnap.key,
...fullData
}
collectedNotes[note.id] = note
...
})
}))
})
(当然,在设置新的侦听器之前,我需要使用.off() 分离侦听器)
这有点问题,因为我必须为每个 note 附加一个侦听器 - 并且数据库中可能有数百条注释。
这是最有效的方法吗? - 似乎效率低下。
有没有办法用一个监听器收听用户在/notes路径中可以访问的ALL注释?还是我的接近完全错误? :)
亲切的问候 /K
【问题讨论】:
标签: javascript firebase firebase-realtime-database nosql