第二/第三级的 firebase 查询

Mor*_*war 5 javascript firebase firebase-realtime-database

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

Users :
        -KNwBd5cF6iY9dWh0eFd :
                name: "Jon Snow"
                phones:
                    phone1: "0123456789"
                    phone2: "0123456987"
Run Code Online (Sandbox Code Playgroud)

我想对phone1值进行查询,我现在orderByChild用来查询数据库,我的代码是:

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

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

ado*_*srs 3

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

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

{ 
  users:
    userId:
       phones:
          0123456789: true
}
Run Code Online (Sandbox Code Playgroud)

然后您将能够通过以下方式检索它:

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

工作jsFiddle


如果你有phoneId.

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

既然您不这样做,那么它就是一个很好的例子,说明您不应该如何构建 noSQL 数据库。

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