Javascript 使用两个中间条件查询Firebase数据库

Javascript 使用两个中间条件查询Firebase数据库,javascript,firebase,firebase-realtime-database,Javascript,Firebase,Firebase Realtime Database,我想知道是否有可能从Firebase数据库返回一个值列表,其中每个元素满足两个条件 例如,如果我的数据库如下所示: MYAPP |_______________items | |_____OshwYF72Jhd9bUw56W7d | | | | | |__item_name:"plank_5" |

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

例如,如果我的数据库如下所示:

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
  }
});