我有一个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());
})
我没有结果。我在查询中缺少什么? 以上两个查询有何不同?这两个查询都不起作用。
答案 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
现在您无需查询即可执行这两项操作:
user1
的所有关键字:ref.child('users/user1/keywords').on(...
key1
的所有用户:ref.parent().child('providers_by_keyword/key1').on(...
这种创建二级索引的方法称为NoSQL数据库中的非规范化。它在Firebase's denormalizing is normal blog post中描述。我还建议您阅读此article about NoSQL data modeling。