Firebase查询双嵌套

 月光下大手拉S小手 发布于 2022-12-08 23:45

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

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

Frank van Pu.. 32

在火力地堡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 /层次数据库新手来说,最重要的一个似乎是"避免构建嵌套".

如果子项的子项包含一个好的示例值,请参阅我对Firebase查询的回答.我还建议阅读Firebase中的多对多关系,以及关于一般NoSQL数据建模的这篇文章.

1 个回答
  • 在火力地堡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 /层次数据库新手来说,最重要的一个似乎是"避免构建嵌套".

    如果子项的子项包含一个好的示例值,请参阅我对Firebase查询的回答.我还建议阅读Firebase中的多对多关系,以及关于一般NoSQL数据建模的这篇文章.

    2022-12-11 02:06 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有