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
现在您无需查询即可执行这两个操作:
- 获取
user1
的所有关键字:ref.child('users/user1/keywords').on(...
- 获取
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.
中有描述
我有一个 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
现在您无需查询即可执行这两个操作:
- 获取
user1
的所有关键字:ref.child('users/user1/keywords').on(...
- 获取
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.
中有描述