【问题标题】:Querying By Multiple Keys in FirebaseFirebase 中的多键查询
【发布时间】:2017-03-05 15:34:50
【问题描述】:

我的 Firebase 数据库中有一个已知密钥列表

-Ke1uhoT3gpHR_VsehIv
-Ke8qAECkZC9ygGW3dEJ
-Ke8qMU7OEfUnuXSlhhl

我如何在一个统一的请求中查询这些键中的每一个,而不是遍历这些键中的每一个以获取其各自对象的快照? Firebase 是否提供此功能?

我发现 Promise.all() 函数看起来很有前途(我发誓没有双关语),但我不确定如何使用获取 Firebase 数据的标准方法来实现它

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

感谢您的帮助!

【问题讨论】:

  • 这些键有关系吗?他们都属于登录用户吗?
  • @David 他们不相关且不属于用户。它们确实驻留在同一个节点下

标签: javascript firebase firebase-realtime-database


【解决方案1】:

正如 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

【讨论】:

  • 谢谢弗兰克,非常有帮助。我的一个问题是,如果我们对 Firebase 使用两个单独的调用 - 一个用于地理数据,一个用于位置数据,我们将有两个单独的对象列表。我们是否可以通过匹配键轻松关联两个列表,而无需遍历两个列表并占用更多时间? (例如,将地理数据添加到具有匹配键的节点)
  • 在 geofire 节点和常规节点之间使用相应的键是使用 Firebase 的惯用方式。
  • 承诺的好主意!感谢您的提示!
猜你喜欢
  • 2016-10-09
  • 2018-06-11
  • 2017-10-13
  • 1970-01-01
  • 1970-01-01
  • 2017-05-28
  • 2017-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多