Firebase按键

时间:2016-01-16 17:13:20

标签: javascript firebase firebase-realtime-database

我有一个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());
})

我没有结果。我在查询中缺少什么? 以上两个查询有何不同?这两个查询都不起作用。

1 个答案:

答案 0 :(得分: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(...
  3. 这种创建二级索引的方法称为NoSQL数据库中的非规范化。它在Firebase's denormalizing is normal blog post中描述。我还建议您阅读此article about NoSQL data modeling