Firebase 查询孙子/多级查询

Firebase querying grandchildren / multilevel querying

提问人:dmo 提问时间:5/12/2015 最后编辑:dmo 更新时间:9/13/2018 访问量:1989

问:

从我所读到的所有内容来看,似乎不可能查询多级值。 我的数据结构如下所示:

{
"dinosaurs": {
    "bruhathkayosaurus": {
        "meta":{
            "addedBy":"John",
            "addedDate":"02021987"
        },
        "appeared": -70000000,
        "height": 25
    },
    "lambeosaurus": {
        "meta":{
            "addedBy":"Peter",
            "addedDate":"12041987"
        },
        "appeared": -76000000,
        "height": 2.1
    }
}
}

在不知道恐龙的键名的情况下,有没有办法查询元节点,只检索约翰添加的项目。

在 JS 中,像这样:

    var ref = new Firebase('test.firebaseio.com/dinosaurs');
    ref.orderByChild("meta/addedBy")
    .equalTo('Peter')
    .on("child_added", function(snapshot) {
        console.log(snapshot);
    });

有骇人听闻的解决方案,但没有一个是可扩展的,我应该把这些数据扁平化吗?

编辑:

我需要代码审查...这是一个可以接受的解决方案吗?

    var ref = new Firebase('test.firebaseio.com/dinosaurs');
    ref.orderByChild("meta")
    .on('child_added',function(snap1){
        snap1.ref().orderByChild("addedBy")
        .equalTo("Peter")
        .on('child_added', function(snap2) {
           console.log(snap2.val());
        })
    });
火力基地

评论

1赞 Frank van Puffelen 5/12/2015
要小心:当你有一个 ,你应该始终考虑相应的时间发生。对于顶级 s,可以是“当页面/应用程序关闭时”,但 your in the callback 将导致随着时间的推移而增加侦听器。解决此问题的常用方法是在循环中使用,但这通常也会导致性能欠佳。onoffononchild_addedonce
2赞 Frank van Puffelen 5/12/2015
另请参阅:stackoverflow.com/questions/30151012/...

答:

6赞 Jay 5/12/2015 #1

编辑 2016 年 1 月:自此答案以来,Firebase 具有深度查询,因此您可以查询 1 级以上的深度查询。

查询的深度只能为 1 级。有许多解决方案,但扁平化数据和链接/引用是一种选择。

在上面的示例中,您可以创建另一个节点,将用户名(父级)链接到他们添加的恐龙(子级)。然后可以读取约翰节点并立即知道他添加了哪些恐龙。然后能够访问有关该恐龙的其他相关数据;添加日期、出现日期、高度等。

users
  John
     bruhathkayosaurus
     Styracosaurus
     Lambeosaurus
     Spinosaurus
  Peter
     Lambeosaurus
     Seismosaurus

您可能希望使用 uid 而不是名称,但您明白了。

此外,目前还不清楚为什么在列出的示例中有一个元节点,因此可以将其展平:

"dinosaurs": {
    "bruhathkayosaurus": {
       "addedBy":"John"
       "addedDate":"02021987"
       "appeared": -70000000
       "height": 25
    }, 

评论

0赞 samurai jack 9/13/2018
请把 编辑 放在顶部。