Firebase API 仅允许您使用其和方法过滤一级深度(或具有已知路径)的子级。orderByChild
equalTo
因此,无需修改/扩展您当前的数据结构,只留下检索所有数据并在客户端过滤它的选项:
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').once('value', function(blogSnapshot) {
var daBlog = blogSnapshot.val();
});
});
您可能还想重新考虑是否可以重组数据以更好地适应您的用例和 Firebase 的限制。他们有一些关于构建数据的很好的文档,但是对于刚接触 NoSQL/分层数据库的人来说,最重要的文档似乎是“避免筑巢”。
如果子项的子项包含一个很好的示例值,请参阅我对 Firebase 查询的回答。我还建议阅读Firebase 中的多对多关系以及有关通用NoSQL 数据建模的文章。