Javascript Firebase按键检索数据
我有一个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 我想检索
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());};是的,你是对的,我可能可以维护一个反向索引。这是一个有趣的解决方案。但是,当你开始保护数据时,你会遇到问题。或者,当应用程序获得更多用户时(并且查询速度变慢)去规范化是一条路:花些时间阅读我链接的文章,并尝试将其中的内容付诸实践。