首页 文章

Firebase查询双嵌套

提问于
浏览
21

鉴于firebase中的数据结构,我想运行一个查询来检索博客'efg' . 我此时不知道用户ID .

{Users :
     "1234567": {
          name: 'Bob',
          blogs: {
               'abc':{..},
               'zyx':{..}
          }
     },
     "7654321": {
          name: 'Frank',
          blogs: {
               'efg':{..},
               'hij':{..}
          }
     }
}

2 回答

  • 26

    Firebase API仅允许您使用 orderByChildequalTo 方法过滤一级深度(或with a known path)的子级 .

    因此,无需修改/扩展当前的数据结构,只留下检索所有数据的选项并在客户端过滤它:

    var ref = firebase.database().ref('Users');
    ref.once('value', function(snapshot) {
        snapshot.forEach(function(userSnapshot) {
            var blogs = userSnapshot.val().blogs;
            var daBlog = blogs['efg'];
        });
    });
    

    这当然是非常低效的,并且当您拥有非平凡数量的用户/博客时无法扩展 .

    因此,通常的解决方案是对树的所谓索引,将您要查找的密钥映射到它所在的路径:

    {Blogs:
         "abc": "1234567",
         "zyx": "1234567",
         "efg": "7654321",
         "hij": "7654321"
    }
    

    然后您可以使用以下命令快速访问博客:

    var ref = firebase.database().ref();
    ref.child('Blogs/efg').once('value', function(snapshot) {
        var user = snapshot.val();
        ref.child('Blogs/'+user+'/blogs').on('value, function(blogSnapshot) {
            var daBlog = blogSnapshot.val();
        });
    });
    

    您可能还想重新考虑是否可以重新构建数据以更好地适应您的用例和Firebase的限制 . 他们有一些关于构建数据的好文档,但对于NoSQL /层次数据库的新手来说,最重要的文档似乎是"avoid building nests" .

    另请参阅Firebase query if child of child contains a value上的答案,以获得一个很好的例子 . 我也建议阅读many-to-many relationships in Firebase,这篇文章一般NoSQL data modeling .

  • 0

    根据您当前的数据结构,您可以检索包含您要查找的博客文章的用户 .

    const db = firebase.database()
    const usersRef = db.ref('users')
    const query = usersRef.orderByChild('blogs/efg').limitToLast(1)
    query.once('value').then((ss) => {
      console.log(ss.val()) //=> { '7654321': { blogs: {...}}}
    })
    

    您需要使用 limitToLast ,因为在使用 orderByChild docs时,对象最后排序 .

相关问题