【问题标题】:firebase query on the second/third level第二/第三级的firebase查询
【发布时间】:2016-07-31 09:50:32
【问题描述】:

我在 Firebase 中使用 Javascript,我想查询存在于第二级或第三级的值,我的数据库就是这样:

Users :
        -KNwBd5cF6iY9dWh0eFd :
                name: "Jon Snow"
                phones:
                    phone1: "0123456789"
                    phone2: "0123456987"

我想查询phone1 值,我现在使用orderByChild 查询数据库,我的代码是:

var ref = firebase.database().ref("users");
ref.orderByChild("name").equalTo("Jon Snow").on("value", function(snapshot) {
    console.log(snapshot.val());
});

但我只能用它来查询第一级值的值,但是如何在第二级或第三级进行另一个查询。

【问题讨论】:

  • 如果我知道了,你要做的是multiple where clauses,这是重复的。
  • 不,我不想做多个 where 我只想对对象的孩子的孩子进行查询

标签: javascript firebase firebase-realtime-database


【解决方案1】:

如果不知道手机 ID 并考虑您当前的数据库结构,这是不可能的。

一种解决方法是使用实​​际电话号码作为/phones 中的密钥。

{ 
  users:
    userId:
       phones:
          0123456789: true
}

然后您将能够使用以下方法检索它:

ref.orderByChild("phones/"+phoneNumber).equalTo(true).once("value", function(snapshot) {
    console.log(snapshot.val());
});

工作jsFiddle


如果你有phoneId,这会很简单。

ref.orderByChild("phones/phone1").equalTo("0123456789").once("value", function(snapshot) {
    console.log(snapshot.val());
});

既然你不这样做,它就变成了一个很好的例子,说明你不应该如何构建一个 noSQL 数据库。

noSQL 数据库非常灵活,其结构很大程度上取决于您的应用程序。所以请记住。例如,如果搜索phoneNumber 在您的应用程序中至关重要,并且您希望在/phones/phoneNumber/ 中拥有更多数据,您应该考虑使用一个新的单独分支以比现在更专门的方式处理此问题。

【讨论】:

  • 阿道夫的回答很好!请注意,您删除的答案是 OPs 数据模型为什么不起作用的一个很好的例子。我建议将它与解释合并到这个答案中(数组通常是一个糟糕的解决方案的另一个原因,尤其是在这种情况下,数据实际上是一个集合)。
  • 嘿@FrankvanPuffelen,在这种情况下我们会有一些索引问题,对吧?会不会导致性能问题?
  • 您需要在每部手机上建立索引。有关解决此问题的替代数据结构,请参阅stackoverflow.com/questions/40656589/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-30
  • 2018-06-04
  • 2016-08-02
  • 1970-01-01
  • 1970-01-01
  • 2023-01-07
  • 1970-01-01
相关资源
最近更新 更多