Firebase查询双重嵌套

鉴于firebase下面的数据结构,我想运行一个查询来检索博客“efg”。 我不知道这个用户的ID。

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

Firebase API只允许您使用orderByChildequalTo方法过滤一层深度(或已知路径 )的子级。

因此,在不修改/扩展当前的数据结构的情况下,只能选择检索所有数据并将其过滤到客户端:

 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 /分层数据库新手来说,最重要的一点似乎是“避免构建嵌套” 。