Firebase 如何绕过唯一ID和引用子节点

Firebase 如何绕过唯一ID和引用子节点,firebase,angularfire,Firebase,Angularfire,我的firbase数据库如下所示: app users -gn4t9u4ut304u9g4 email uid 如何引用电子邮件和uid?当我尝试这个: $rootScope.dashtype.child('users').orderByChild('uid').equalTo($rootScope.auth.uid).on('value', function(snapshot){ $r

我的firbase数据库如下所示:

app
   users
       -gn4t9u4ut304u9g4
            email
            uid
如何引用电子邮件和uid?当我尝试这个:

        $rootScope.dashtype.child('users').orderByChild('uid').equalTo($rootScope.auth.uid).on('value', function(snapshot){
            $rootScope.user = snapshot.val();
            console.log($rootScope.user);
        })
我获得了正确的对象,但唯一id为root:

Object {-JvaZVrWGvJis0AYocBa: Object}

因为这是一个动态属性,我不知道如何引用子对象。我只希望能够访问如下用户字段:$rootScope.user.email等。

由于您请求一个值,因此会得到一个用户列表。它可能只有一个用户,但仍然是一个用户列表

您必须在快照上循环才能到达子节点:

$rootScope.dashtype.child('users').orderByChild('uid').equalTo($rootScope.auth.uid).on('value', function(snapshot){
    snapshot.forEach(function(userSnapshot) {
        $rootScope.user = userSnapshot.val();
        console.log($rootScope.user);
    });
});
因为列表中只有一个用户,所以循环只执行一次

您在这里混合了常规Firebase JavaScript和AngularFire。这意味着您需要通知AngularJS您已更新了范围,以便它重新呈现视图:

$rootScope.dashtype.child('users').orderByChild('uid').equalTo($rootScope.auth.uid).on('value', function(snapshot){
    snapshot.forEach(function(userSnapshot) {
        $timeout(function() {
            $rootScope.user = userSnapshot.val();
            console.log($rootScope.user);
        });
    });
});

“-gn4t9u4ut304u9g4”不是uid。它是Firebase在推送某些内容时自动创建的唯一ID。正因为如此,我现在不知道如何引用用户字段。我最初的评论只是想了半天,不小心贴了出来——已经被删除了。因为您知道您想要的用户的UID($RooStudio.Auth.UID),所以您可能需要考虑使用UID作为每个用户的节点名称。有两个好处,它将简化您的上述代码,因为用户节点可以直接使用以下内容读取:var ref=new Firebase(Firebase_URL+'/users/'+authUser.uid)。此外,它还可以使编写安全规则更容易,因为可以使用$user_id之类的变量来引用每个节点名称(uid)。@Jay是的,这是我想要的,但问题是Firebase id(时间戳)会自动创建为我的userdata的根。因此,按照您的建议执行此操作,仍然会遇到如下问题:FIREBASE_URL+'/users/*FirebaseID*/'+authUser.uid)。如果只有一种方法可以在执行推送呼叫时禁用时间戳。请阅读:查看如何按用户的
uid
存储用户。提示:调用
push()
将生成一个推id并将对象存储在该id下,调用
set()
将对象存储在该位置。所以
ref.child(useruid).set(user)
。但正如我所说的:阅读文档,他们比我在评论中解释得更好。这很有效。谢谢但对于我想要完成的任务来说,这似乎太过分了。如果不是因为愚蠢的Firebase ID,我可以这么做:$rootScope.user=new Firebase(“);那你为什么要将用户存储在推送ID下呢?我很确定Firebase文档中的示例是按用户的
uid
存储用户的(Jay在他的评论中也这么说)好问题!如果我使用set(),我不认为我可以在“users”下有多个对象,因此必须使用push()。直觉上,我认为set()和push()在Javascript中是字符串和数组,但这种心理模型不太合适。对于像我这样愚蠢的人,应该在文档中更好地解释它。