2015-07-11 74 views
1

比方说,我有我的火力地堡这样的数据:火力地堡 - 搜索一个孩子按值

https://mygame.firebaseio.com/player

{ 
    "player": { 
    "bloodgulf01": { 
     "username": "bloodgulf01", 
     "uid": "twitter:102032", 
     "level": 2, 
     "map": 3, 
     "x": 51, 
     "y": 12 
    }, 
    "damjanovic": { 
     "username": "damjanovic", 
     "uid": "github:77371", 
     "level": 5, 
     "map": 2, 
     "x": 21, 
     "y": 44 
    } 
    } 
} 

我怎么会由uid搜索和获取结果的snapshot

这是我曾尝试:

new Firebase("https://mygame.firebaseio.com/player") 
    .startAt(authData.uid) 
    .endAt(authData.uid) 
    .once('value', function(snap) { 
     console.log('accounts matching UID of ' + authData.uid, snap.val()) 
    }); 

将返回:accounts matching UID of github:123456789 null尽管拥有uid/player/数据里面......

回答

1

请记住,一切都在火力地堡是一个URL。所以,你可以做到这一点,以获得数据,你想:

'https://mygame.firebaseio.com/player/' + uid 
+0

是的,但它们不是作为UID存储,而是作为玩家的用户名登录 –

+0

@DanF为什么不把用户名存储在相反的uid instad下?由于uid始终是唯一的,因此比存储键作为玩家名称更好。 – Chrillewoodz

+2

@Chrilliewoodz我想,但后来我不知道如何搜索数据库中的用户名...。 –

4

排序要筛选,然后子Filter:

new Firebase("https://mygame.firebaseio.com/player") 
    .orderByChild('uid') 
    .equalTo(authData.uid) 
    .once('child_added', function(snap) { 
    console.log('account matching UID of ' + authData.uid, snap.val()) 
    }); 

既然你只希望一个球员,你可以可能会通过once('child_added'。如果你需要用相同的UID,以处理潜在多个玩家,则:

.on('child_added', function(snap) { 
    console.log('account matching UID of ' + authData.uid, snap.val()) 
    }); 

或者

.once('value', function(snap) { 
    snap.forEach(function(child) { 
     console.log('account matching UID of ' + authData.uid, child.val()) 
    }); 
    }); 

我与Chrillewoodz在结构上,虽然我会总是希望看到的uid为一个用户集合的关键。在这种情况下,您可以使用上述方法搜索名称。