Javascript 使用两个中间条件查询Firebase数据库
我想知道是否有可能从Firebase数据库返回一个值列表,其中每个元素满足两个条件 例如,如果我的数据库如下所示:Javascript 使用两个中间条件查询Firebase数据库,javascript,firebase,firebase-realtime-database,Javascript,Firebase,Firebase Realtime Database,我想知道是否有可能从Firebase数据库返回一个值列表,其中每个元素满足两个条件 例如,如果我的数据库如下所示: MYAPP |_______________items | |_____OshwYF72Jhd9bUw56W7d | | | | | |__item_name:"plank_5" |
MYAPP
|_______________items
| |_____OshwYF72Jhd9bUw56W7d
| | |
| | |__item_name:"plank_5"
| | |__length:"120"
| | |__width:"50"
| |
| |_____KbHy4293dYgVtT9pdoW
| |_____PS8tgw53SnO892Jhweh
| |_____Gicuwy8r23ndoijdakr
|
|___customers
我想在数据库中查询长度在100-150和宽度在30-70之间的每个项目的item\u name
,有没有办法通过Firebase查询来实现这一点
我已经阅读了这里的答案:但这不涉及多个介于
/范围
之间的子句,这是我在上述场景中需要的
我在另一个答案中看到了这个插件:但是where
子句似乎没有取值范围。例如:
const queriedDbRef = querybaseRef
.where({
length: (between 100-150),
width: (between 30-70)
});
这样的质疑可能吗?或者,我必须获取与一个条件匹配的所有项目,然后使用Javascript在客户端应用第二个条件?Firebase数据库查询只能对一个属性进行排序/筛选。这是一个在不久的将来不太可能改变的硬限制 在某些情况下,可以将多个值组合到一个属性中,例如您链接的“我的答案”或在QueryBase中。但在您发现的这些情况下,您只能对其中一个值执行相对/范围查询:即最后一个值 有人(据我所知)实施过多值范围查询的唯一情况是在GeoFire中,我们将一个位置的经度和纬度组合成一个所谓的。我强烈建议阅读更多关于GeoHash的内容,因为GeoHash做了一些非常独特的事情:将两个数值组合成一个字符串值,允许对其数值组件进行排序和过滤 通过查看要组合的两个值(长度和宽度),可以从它们创建类似的复合字符串。但是需要找到一种方法,为您的用例组合这两个值。我能想到的最简单的方法是存储区域,因此长度*宽度:
{
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)之间的项目:
此查询将匹配太多的项,因此您必须在客户端执行一些额外的筛选以拒绝不匹配(Geofire也会这样做):
query.on(“添加了子项”),函数(快照){
var item=snapshot.val();
如果(item.length>=100&&item.length=30&&item.width,Firebase数据库查询只能对一个属性进行排序/筛选。这是一个硬限制,在不久的将来不太可能更改
在某些情况下,可以将多个值组合到一个属性中,例如您链接的“我的答案”或在QueryBase中。但在您发现的这些情况下,您只能对其中一个值执行相对/范围查询:即最后一个值
唯一一个有人(据我所知)的情况GeoFire中曾经实现过多值范围查询,我们将一个位置的经度和纬度组合成一个所谓的值。我强烈建议阅读更多关于GeoHash的内容,因为GeoHash的功能非常独特:将两个数值组合成一个字符串值,允许对其数值组件进行排序和过滤
通过查看要组合的两个值(长度和宽度),可能会从它们中创建类似的复合字符串。但需要找到一种方法来组合用例中的两个值。我认为最简单的方法是存储区域,因此长度*宽度:
{
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)之间的项目:
此查询将匹配太多的项,因此您必须在客户端执行一些额外的筛选以拒绝不匹配(Geofire也会这样做):
query.on(“添加了子项”),函数(快照){
var item=snapshot.val();
如果(item.length>=100&&item.length=30&&item.width这真的很有趣@frank van puffelen!谢谢你的详细回答。我接受了你的建议,在过去的一天里一直在努力学习geoFire,但是我在从geoFire查询返回ID时遇到了一点问题,不知道你是否可以在这里查看它:再次感谢!我主要使用Geofire作为一个例子,说明如果你跳出框框思考并愿意付出努力,那么看似不可能的事情是如何可能的。作为一个人,我永远不会想到将经度和纬度组合在一个字符串中,以使它们保持可排序。幸运的是,长度*宽度稍微容易一些o计算::-)这真的很有趣@frank van puffelen!谢谢你的详细回答。我接受了你的建议,在过去的一天里一直在尝试学习geoFire,但是我在从geoFire查询返回ID时遇到了一点问题,不知道你是否可以在这里看一看:再次感谢你的回答!我主要使用geoFire作为前用户如果你跳出框框去思考,并愿意付出努力,那么似乎不可能的事情是多么的可能。我从来没有想过将经度和纬度组合在一个字符串中,以使它们保持可排序。幸运的是,长度*宽度稍微容易计算。:-)
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
}
});