【问题标题】:Firebase retrieve data by keyFirebase 按键检索数据
【发布时间】:2016-04-22 03:35:02
【问题描述】:

我有一个如下的firebase节点-

providers
  -userid1
   --userid : userid1
   --keywords
     ---key1 : true
     ---key2 : true
     ---key3 : true
  -userid2
   --userid : userid2
   --keywords
     ---key1 : true
     ---key4 : true
     ---key5 : true

我想检索所有在其关键字 child 中包含“key1”的用户 ID。

我尝试了以下查询

var ref = new Firebase(url+"/providers")
ref.orderByChild("keywords").equalTo("key1").on("value", function(snapshot){
console.log(snapshot.numChildren());
})

也试过了-

var ref = new Firebase(url+"/providers")
ref.orderByKey().equalTo("key1").on("value", function(snapshot){
console.log(snapshot.numChildren());
})

我没有得到任何结果。我在查询中遗漏了什么? 以上两个查询有何不同?这两个查询都不起作用。

【问题讨论】:

    标签: javascript firebase firebase-realtime-database


    【解决方案1】:

    您的key1 是键,而equalTo() 用于检查值。

    诀窍是查询key1键值为true的记录:

    var ref = new Firebase(url+"/providers")
    ref.orderByChild("keywords/key1").equalTo(true).on("value", function(snapshot){
        console.log(snapshot.numChildren());
    })
    

    不要忘记将keywords/key1 等的索引添加到您的rules.json:

    "providers": {
      "$uid": {
        ".indexOn": ["keywords/key1", "keywords/key2", "keywords/key3", "keywords/key4", "keywords/key5"]
      }
    }
    

    您可能会发现添加此类索引是不可维护的,这很好地表明您的数据结构应该改进。在这种情况下,可以通过添加从每个特定键映射回匹配提供程序的二级倒排索引来完成:

    providers
      userid1
        userid : userid1
        keywords
          key1 : true
          key2 : true
          key3 : true
      userid2
        userid : userid2
        keywords
          key1 : true
          key4 : true
          key5 : true
    providers_by_keyword:
      key1:
        userid1: true
        userid2: true
      key2:
        userid1: true
      key3:
        userid1: true
      key4:
        userid2: true
      key5:
        userid2: true
    

    现在您无需查询即可执行这两个操作:

    1. 获取user1的所有关键字:ref.child('users/user1/keywords').on(...
    2. 获取key1的所有用户:ref.parent().child('providers_by_keyword/key1').on(...

    这种创建二级索引的方法在 NoSQL 数据库中称为非规范化。它在Firebase's denormalizing is normal blog post 中有描述。我也推荐阅读这个article about NoSQL data modeling

    【讨论】:

    • 谢谢弗兰克。很好的答案,我对索引仍然有些模糊。这个查询对我有用 ref.orderByChild("key1").on("value", function(s){ console.log(s.val()); });是的,你是对的,我大概可以维护一个倒排索引。
    • 有趣的解决方案。但是当您开始保护数据时会遇到问题。或者随着应用程序获得更多用户(并且查询变得更慢)。非规范化是要走的路:花一些时间阅读我链接的文章并尝试将其中的内容付诸实践。
    猜你喜欢
    • 2017-01-28
    • 1970-01-01
    • 2018-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-26
    • 1970-01-01
    相关资源
    最近更新 更多