鉴于firebase中的数据结构,我想运行一个查询来检索博客'efg'.我此时不知道用户ID.
{Users : "1234567": { name: 'Bob', blogs: { 'abc':{..}, 'zyx':{..} } }, "7654321": { name: 'Frank', blogs: { 'efg':{..}, 'hij':{..} } } }
Frank van Pu.. 32
在火力地堡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').on('value, function(blogSnapshot) {
var daBlog = blogSnapshot.val();
});
});
如果您可以重新构建数据以更好地适应您的用例和Firebase的限制,您可能还需要重新考虑.他们有一些关于构建数据的好文档,但对于NoSQL /层次数据库新手来说,最重要的一个似乎是"避免构建嵌套".
如果子项的子项包含一个好的示例值,请参阅我对Firebase查询的回答.我还建议阅读Firebase中的多对多关系,以及关于一般NoSQL数据建模的这篇文章.
在火力地堡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').on('value, function(blogSnapshot) {
var daBlog = blogSnapshot.val();
});
});
如果您可以重新构建数据以更好地适应您的用例和Firebase的限制,您可能还需要重新考虑.他们有一些关于构建数据的好文档,但对于NoSQL /层次数据库新手来说,最重要的一个似乎是"避免构建嵌套".
如果子项的子项包含一个好的示例值,请参阅我对Firebase查询的回答.我还建议阅读Firebase中的多对多关系,以及关于一般NoSQL数据建模的这篇文章.