获取属于Firebase中同一组的项目

时间:2015-04-04 06:45:20

标签: angularjs firebase

我有一个简单的用户和事件数据结构。我想找到所有参加登录用户相同事件的用户。用户可以参加多个活动。

我的数据设置如下

{
   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
                    }
                });
            });
        });
    });
});

1 个答案:

答案 0 :(得分:0)

我可能会将最外层的查询从once('value'更改为on('child_added'(以及其他child_*兄弟姐妹)。主要优点是您正在监视/同步数据,而不是只检索一次。另一个优点是它不再需要您的第一个forEach

除此之外,这看起来很常见。内部调用需要为once,因为您只希望它们执行一次。大多数人都会因为on次呼叫的次数而感到紧张。但是,在建立初始websocket连接之后,Firebase的数据检索几乎没有开销,所以这通常表现得非常好。

在这个答案中有很多“应该”,“通常”和“可能”,因为确定的唯一方法是你实际上:

  • 验证代码在功能上是否符合您的应用程序要求
  • 在您希望用户遇到的条件下衡量代码的效果

如果遇到高于预期的延迟,可以考虑进一步对数据进行非规范化。例如:您可以在每个事件中保留用户名,现在您可以存储true。有了它,您需要查找每个用户的名字。