2017-02-14 58 views
0

我想知道是否有可能从我的Firebase数据库返回一个值列表,其中每个元素满足两个条件。在两个条件之间查询Firebase数据库

例如,如果我的数据库是这样的:

MYAPP 
|_______________items 
|     |_____OshwYF72Jhd9bUw56W7d 
|     |     | 
|     |     |__item_name:"plank_5" 
|     |     |__length:"120"    
|     |     |__width:"50"    
|     |        
|     |_____KbHy4293dYgVtT9pdoW 
|     |_____PS8tgw53SnO892Jhweh 
|     |_____Gicuwy8r23ndoijdakr 
| 
|___customers 

我想查询有100-150之间的长度和30-之间的宽度每一个项目的item_name数据库70,有没有办法让我用Firebase查询来做到这一点?

我已阅读答案:Query based on multiple where clauses in firebase但不涉及多个between/range子句,这是我在上面的场景中需要的。

我在另一个答案中看到了这个插件:https://github.com/davideast/Querybasewhere子句似乎没有采取一系列值。例如:

const queriedDbRef = querybaseRef 
    .where({ 
    length: (between 100-150), 
    width: (between 30-70) 
    }); 

这样的查询甚至有可能吗?或者我将不得不让所有项目匹配一个条件,然后应用第二个条件客户端,使用Javascript?

回答

3

Firebase数据库查询只能对一个属性进行排序/筛选。这是一个艰难的限制,不可能在不久的将来改变。

一些情况下,有可能将多个值组合成一个属性,例如我的答案你链接或在QueryBase。但是,在您发现的情况下,您只能对这些值中的一个执行相对/范围查询:即最后一个。

在GeoFire中,有人(据我所知)实施多值范围查询的唯一情况是,我们将位置的经度和纬度组合成所谓的GeoHash。我强烈建议阅读更多有关geohashes的内容,因为它们做的事情非常独特:将两个数值组合成一个字符串值,以便对其数字组件进行排序和过滤。

通过查看要合并的两个值(长度和宽度),它可以从可能从它们创建一个类似的组合字符串。但是要求你找到一种方法来为你的用例合并这两个值。最简单的方式,我可以认为,如果将存储区域,所以长*宽:

{ 
    items: { 
    "OshwYF72Jhd9bUw56W7d": { 
     item_name:"plank_5", 
     length: 120, // you store length and width as strings, please fix that 
     width: 50, 
     area: 6000 
    } 
    } 
} 

这样,你可以为项目与3000(100x30)和10500(70x150)之间的区域进行过滤:

var query = ref.orderBy("area").startAt(3000).endAt(10500); 

这个查询将匹配的项目太多,所以你将不得不进行一些额外的过滤客户端拒绝不匹配(Geofire做同样的BTW):

query.on("child_added", function(snapshot) { 
    var item = snapshot.val(); 
    if (item.length >= 100 && item.length <= 150 
     && item.width >= 30 && item.width <= 70) { 
    // TODO: do something with the item 
    } 
}); 
+0

这真的很有趣@ frank-van-puffelen!感谢您的详细解答。我已经接受了你的建议,并且一直试图在最后一天学习geoFire,尽管我从返回geoFire查询的ID时遇到了一些问题,并且想知道是否可以在这里查看它:http: //stackoverflow.com/questions/42275999/firebase-geofire-how-to-return-an-array-of-ids-within-a-range再次感谢! – Emily

+0

我主要使用Geofire作为一个例子,看看如果您在盒子外面思考并愿意付出努力,看似不可能的事情是可能的。对于一个人来说,我永远不会想到将经度和纬度结合在一个字符串中,以便它们仍然可以排序。幸运的是,长度*宽度稍微容易计算。 :-) –