Firebase 按键检索数据

Firebase retrieve data by key

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

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

您的 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. I also recommend reading this article about NoSQL data modeling.

中有描述