我有一个简单的用户和事件数据结构。我想找到所有参加登录用户相同事件的用户。用户可以参加多个活动。
我的数据设置如下
{
events:{
123:{
name: 'event1',
users:{
9876: true,
7564: true
}
}
},
users:{
9876:{
name: 'John',
events:{
123: true
}
},
7564:{
name: 'Peter',
events:{
123: true
}
}
}
}
我有以下代码来实现这一点,我只是想知道我是否在正确的路径上,如果我的数据结构对于这种类型的查询是正确的(Firebaseref是一个Angular工厂)
FirebaseRef.child("users/" + authData.uid + "/events").orderByChild('displayName').once("value", function (snap) {
snap.forEach(function (event) {
FirebaseRef.child("events/" + event.key() + "/users").once("value", function (userSnap) {
userSnap.forEach(function (user) {
FirebaseRef.child("users/" + user.key()).once("value", function (realUserSnap) {
if (realUserSnap.key() != authData.uid) {
//This is a user who attends the same event
}
});
});
});
});
});
答案 0 :(得分:0)
我可能会将最外层的查询从once('value'
更改为on('child_added'
(以及其他child_*
兄弟姐妹)。主要优点是您正在监视/同步数据,而不是只检索一次。另一个优点是它不再需要您的第一个forEach
。
除此之外,这看起来很常见。内部调用需要为once
,因为您只希望它们执行一次。大多数人都会因为on
次呼叫的次数而感到紧张。但是,在建立初始websocket连接之后,Firebase的数据检索几乎没有开销,所以这通常表现得非常好。
在这个答案中有很多“应该”,“通常”和“可能”,因为确定的唯一方法是你实际上:
如果遇到高于预期的延迟,可以考虑进一步对数据进行非规范化。例如:您可以在每个事件中保留用户名,现在您可以存储true
。有了它,您需要查找每个用户的名字。