2017-03-05 42 views
1

我在我的火力地堡数据库中的已知密钥列表查询通过多个键在火力地堡

-Ke1uhoT3gpHR_VsehIv 
-Ke8qAECkZC9ygGW3dEJ 
-Ke8qMU7OEfUnuXSlhhl 

而不是通过这些按键的循环,以取回其各自的对象的快照,我怎么可以查询每个这些密钥在一个统一的请求中? Firebase是否提供此功能?

我已经发现了Promise.all()功能,看起来很有希望(没有双关语意我发誓),但我不知道如何使用获取火力数据,像这样

var userId = firebase.auth().currentUser.uid; 
return firebase.database().ref('/users/' + userId).once('value').then(function(snapshot) { 
    var username = snapshot.val().username; 
}); 

感谢的标准的方式来实现它任何帮助!

+1

这些密钥是否相关?他们都属于登录的用户吗? – David

+0

@大卫他们是不相关的,不属于一个用户。尽管 –

回答

8

正如David的评论所暗示的那样:如果这些项目在某些方面是相关的,那么您可以建立一个查询来获取它们。

否则这会做的伎俩:

var keys = [ 
    "-Ke1uhoT3gpHR_VsehIv", 
    "-Ke8qAECkZC9ygGW3dEJ", 
    "-Ke8qMU7OEfUnuXSlhhl" 
]; 
var promises = keys.map(function(key) { 
    return firebase.database().ref("/items/").child(key).once("value"); 
}); 
Promise.all(promises).then(function(snapshots) { 
    snapshots.forEach(function(snapshot) { 
    console.log(snapshot.key+": "+snapshot.val()); 
    }); 
}); 

注意,检索每个项目有一个单独的请求并不像你想象的那么慢,因为请求都发送了一个连接。有关更详细的解释,请参阅Speed up fetching posts for my social network app by using query instead of observing a single event repeatedly

+0

他们确实居住在同一节点下感谢弗兰克,非常有帮助。我的一个问题是,如果我们使用两个独立的Firebase调用 - 一个用于地理数据,一个用于位置数据,我们将有两个单独的对象列表。我们是否可以轻松地通过匹配键将这两个列表关联起来,而无需遍历这两个列表并占用更多时间? (例如,将地理数据添加到具有匹配关键字的节点) –

+0

在geofire节点和常规节点之间使用相应的键,它使用Firebase的惯用方式。 –

+0

好主意的承诺!谢谢你的提示! – Junior