Firebase查询双重嵌套
鉴于firebase下面的数据结构,我想运行一个查询来检索博客“efg”。 我不知道这个用户的ID。
{Users : "1234567": { name: 'Bob', blogs: { 'abc':{..}, 'zyx':{..} } }, "7654321": { name: 'Frank', blogs: { 'efg':{..}, 'hij':{..} } } }
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').on('value, function(blogSnapshot) { var daBlog = blogSnapshot.val(); }); });
如果您可以重新构建数据以更好地适合您的使用情况和Firebase的限制,那么您可能还需要重新考虑。 他们在构建数据方面有一些很好的文档,但是对于NoSQL /分层数据库新手来说,最重要的一点似乎是“避免构建嵌套” 。
- 从GCM迁移到FCM需要?
- 在哪里设置Facebook应用程序的OauthredirectURI?
- 如何在Firebase数据库中进行简单的stringsearch?
- 在Firebase的Cloud Functions中从数据库中获取用户标识?
- 如何使用Firebase Cloud Messaging将设备发送到设备消息?
- 借助Ionic应用的Firebase云消息传递
- Firebase数据库快速入门处理的方式是否安全?
- 在更新到新的Firebase之后获取Exception java.lang.NoClassDefFoundError:com.google.firebase.FirebaseOptions
- 是否有可能查询不符合指定条件的数据?