作者:我是风一样的我们 | 来源:互联网 | 2023-05-18 12:13
我想知道是否有可能从我的Firebase数据库返回一个值列表,其中每个元素都满足两个条件.例如,如果我的数据库如下所示:MYAPP|_______________items|
我想知道是否有可能从我的Firebase数据库返回一个值列表,其中每个元素都满足两个条件.
例如,如果我的数据库如下所示:
MYAPP
|_______________items
| |_____OshwYF72Jhd9bUw56W7d
| | |
| | |__item_name:"plank_5"
| | |__length:"120"
| | |__width:"50"
| |
| |_____KbHy4293dYgVtT9pdoW
| |_____PS8tgw53SnO892Jhweh
| |_____Gicuwy8r23ndoijdakr
|
|___customers
而且我想在数据库中查询长度在100-150之间且宽度在30-70之间的每个项目的item_name,是否可以通过Firebase查询来实现?
我在这里已经阅读了答案:Query based on multiple where clauses in firebase,但是它不能处理多个between / range子句,这是我在上述情况下需要的.
我在另一个答案中看到了该插件:https://github.com/davideast/Querybase,但是where子句似乎没有取值范围.例如:
const queriedDbRef = querybaseRef
.where({
length: (between 100-150),
width: (between 30-70)
});
这样的查询是否可能?还是我必须获取所有匹配一个条件的项目,然后使用Javascript在客户端应用第二个条件?
解决方法:
Firebase数据库查询只能对一个属性进行排序/过滤.这是一个硬性限制,在不久的将来不太可能改变.
在某些情况下,可以将多个值组合到单个属性中,例如您链接或在QueryBase中的答案.但是,在您发现的那些情况下,您只能对其中一个值(即最后一个)执行相对/范围查询.
(据我所知)有人曾经实施过多值范围查询的唯一情况是在GeoFire中,我们将位置的经度和纬度合并为一个所谓的GeoHash.我强烈建议您阅读有关地理哈希的更多信息,因为他们这样做一些非常独特的东西:将两个数字值组合成一个字符串值,该字符串值允许对其数字分量进行排序和过滤.
通过查看您想要组合的两个值(长度和宽度),可能可以从它们创建一个相似的复合字符串.但要求您找到一种方法,以结合用例的两个值.我能想到的最简单的方法就是存储区域,所以长*宽:
{
items: {
"OshwYF72Jhd9bUw56W7d": {
item_name:"plank_5",
length: 120, // you store length and width as strings, please fix that
width: 50,
area: 6000
}
}
}
这样,您可以过滤面积在3000(100×30)到10500(70×150)之间的项目:
var query = ref.orderBy("area").startAt(3000).endAt(10500);
此查询将匹配太多项目,因此您将不得不在客户端执行一些额外的过滤操作以拒绝不匹配(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
}
});