Javascript Firebase按键检索数据

Javascript Firebase按键检索数据,javascript,firebase,firebase-realtime-database,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 我想检索

我有一个firebase节点,如下所示-

providers
  -userid1
   --userid : userid1
   --keywords
     ---key1 : true
     ---key2 : true
     ---key3 : true
  -userid2
   --userid : userid2
   --keywords
     ---key1 : true
     ---key4 : true
     ---key5 : true
我想检索所有在其子关键字中包含“key1”的用户标识

我尝试了以下查询

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
key的值为
true
时查询记录:

var ref = new Firebase(url+"/providers")
ref.orderByChild("keywords/key1").equalTo(true).on("value", function(snapshot){
    console.log(snapshot.numChildren());
})
不要忘记将
关键字/key1
等索引添加到规则中。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
现在,无需查询即可执行这两个操作:

  • 获取
    user1
    的所有关键字:
    ref.child('users/user1/keywords')。在(…
  • 获取(…

  • 这种创建二级索引的方法在NoSQL数据库中被称为非规范化。在中进行了描述。我也建议阅读此方法。

    谢谢Frank。回答得好,我在索引方面仍然有点模糊。此查询对我有效。参考。orderByChild(“key1”)。on(“value”,函数{console.log(s.val());};是的,你是对的,我可能可以维护一个反向索引。这是一个有趣的解决方案。但是,当你开始保护数据时,你会遇到问题。或者,当应用程序获得更多用户时(并且查询速度变慢)去规范化是一条路:花些时间阅读我链接的文章,并尝试将其中的内容付诸实践。