Firebase查询日期范围内的数据

Firebase查询日期范围内的数据,firebase,firebase-realtime-database,Firebase,Firebase Realtime Database,我的firebase数据如下所示: { "lambeosaurus": { "vacationDates" : "2016-12-20 - 2016-12-25", "length" : 12.5, "weight": 5000 }, "stegosaurus": { "vacationDates" : "2016-12-10 - 2016-12-20", "length" : 9, "weight" : 2500 } } "ho

我的firebase数据如下所示:

{
  "lambeosaurus": {
    "vacationDates" : "2016-12-20 - 2016-12-25",
    "length" : 12.5,
    "weight": 5000
  },
  "stegosaurus": {
    "vacationDates" : "2016-12-10 - 2016-12-20",
    "length" : 9,
    "weight" : 2500
  }
}
"holidays": {
  ...
  "2016-12-19": {
    "stegosaurus": true
  },
  "2016-12-20": {
    "lambeosaurus": true,
    "stegosaurus": true
  },
  "2016-12-21": {
    "lambeosaurus": true
  },
  ...
}

我如何查询2016年12月20日将外出度假的所有恐龙(即它应该同时返回蓝尾龙和剑龙)?或者我应该以不同的方式存储数据?如果是,我应该如何存储数据以获得最佳性能?谢谢。

我建议以不同的方式存储数据。为“vacationStart”使用一个属性,为“vacationEnd”使用一个属性。另外,将所有恐龙放在“恐龙”节点中,而不是根节点中

因此,为了查询2016-12-20年休假的所有恐龙,您可以使用以下查询:

var query = firebase.database().ref('dinousaurs').orderByChild('vacationStart').equalTo('2016-12-20');

结合这两个日期并不能使数据库更容易查询

如果你正在寻找某个特定日期度假的恐龙,它们可能在该日期之前的任何时候都去度假了。(除非有规定假日天数上限的政策。)因此,结束日期可能是您想要查询的:

{
  "lambeosaurus": {
    "vacationStart" : "2016-12-20",
    "vacationEnd" : "2016-12-25",
    "length" : 12.5,
    "weight": 5000
  },
  "stegosaurus": {
    "vacationStart" : "2016-12-10",
    "vacationEnd" : "2016-12-20",
    "length" : 9,
    "weight" : 2500
  }
}
如果
vacationStart
2016-12-20
当天或之后有
vacationEnd
的恐龙将在该日期休假,前提是
vacationStart
2016-12-20
之前:

函数GetHolidayingDiolars(天){
返回firebase.database()
.ref(“恐龙”)
.orderByChild(“度假区”)
.startAt(天)
.一次(“价值”)
。然后((快照)=>{
让度假=[];
snapshot.forEach((子项)=>{
设val=child.val();
if(val.vacationStart console.log(度假));
除了在客户机上执行进一步筛选之外,没有直接的替代方法,因为您只能使用单个属性查询Firebase,并且组合日期并不特别有用,因为开始和结束日期可以是查询日期当天或之前/之后的任何日期

无论如何,使用
vacationEnd
进行查询很可能会在服务器上执行大部分过滤——除非你有很多恐龙提前计划好假期

如果上述方法导致在客户机上检索和过滤的信息过多,您可以投入一些额外的精力,并通过存储以下结构的额外数据来维护自己的度假恐龙地图:

{
  "lambeosaurus": {
    "vacationDates" : "2016-12-20 - 2016-12-25",
    "length" : 12.5,
    "weight": 5000
  },
  "stegosaurus": {
    "vacationDates" : "2016-12-10 - 2016-12-20",
    "length" : 9,
    "weight" : 2500
  }
}
"holidays": {
  ...
  "2016-12-19": {
    "stegosaurus": true
  },
  "2016-12-20": {
    "lambeosaurus": true,
    "stegosaurus": true
  },
  "2016-12-21": {
    "lambeosaurus": true
  },
  ...
}
Firebase的多位置更新可用于简化映射的维护(中有更多多位置示例):


然后,对
holidays/2016-12-20
的查询将返回一个对象,其中包含每个度假恐龙的键。

使用update()可以让firebase生成一个像push()这样的唯一id吗?例如,数据应该看起来像这样{“lambeosaurus”:{firebaseUniqueId:{“vacationStart”:“2016-12-20”,“vacationEnd”:“2016-12-25”,},firebaseUniqueId-2:{“假期开始”:“2017-01-21”,“假期结束”:“2017-01-25”,},},剑龙:{firebaseUniqueId-3:{“假期开始”:“2016-12-10”,“假期结束”:“2016-12-20”}不,但是ID是在客户端生成的,很容易生成。这将生成一个密钥,您可以在
更新
调用中的路径中使用:
让key=firebase.database().ref().push().key
(请注意,这样做不会触及数据库;这一切都发生在客户端上。)