2016-01-16 160 views
0

检索数据我有一个火力点如下 -火力地堡的关键

providers 
    -userid1 
    --userid : userid1 
    --keywords 
    ---key1 : true 
    ---key2 : true 
    ---key3 : true 
    -userid2 
    --userid : userid2 
    --keywords 
    ---key1 : true 
    ---key4 : true 
    ---key5 : true 

我想检索所有那些在他们的关键字子“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

您的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. 在这种情况下,可以通过添加从每一个具体的按键映射回匹配供应商的辅助,倒排索引来完成得到所有关键字user1ref.child('users/user1/keywords').on(...
  2. 得到所有用户key1ref.parent().child('providers_by_keyword/key1').on(...

这种创建二级索引的方法在NoSQL数据库中称为非规范化。它在Firebase's denormalizing is normal blog post中有描述。我也推荐阅读这个article about NoSQL data modeling

+0

谢谢弗兰克。很好的回答,我在索引上仍然有点模糊。此查询对我有用 ref.orderByChild(“key1”)。on(“value”,function(s){console.log(s.val()); }); 是的,你说得对,我可以保持倒排索引。 – Nikhil

+1

有趣的解决方案。但是当你开始保护数据时,你会遇到问题。或者当应用程序获得更多用户时(并且查询变得更慢)。非规范化是要走的路:花一些时间阅读我链接的文章,并尝试将实践内容放在那里。 –