Firebase查询日期范围内的数据

use*_*644 7 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
  }
}
Run Code Online (Sandbox Code Playgroud)

我如何查询将在2016-12-20度假的所有恐龙(即它应该返回lambeosaurus和剑龙)?或者我应该以不同方式存储数据?如果是这样,我应该如何存储数据以获得最佳性能?谢谢.

car*_*ant 9

在使数据库更易于查询方面,组合这两个日期并没有太大作用.

如果您在特定日期在假期搜索恐龙,他们可以在该日期之前的任何时间去度假.(除非有一项政策要求假期中的最大天数.)因此,结束日期可能是您要查询的内容:

{
  "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
  }
}
Run Code Online (Sandbox Code Playgroud)

任何具有vacationEndon或after的恐龙2016-12-20将在该日期休假,如果vacationStart是在或之前2016-12-20:

function getHolidayingDinosaurs(day) {
  return firebase.database()
    .ref("dinousaurs")
    .orderByChild("vacationEnd")
    .startAt(day)
    .once("value")
    .then((snapshot) => {
      let holidaying = [];
      snapshot.forEach((child) => {
        let val = child.val();
        if (val.vacationStart <= day) {
          holidaying.push(val);
        }
      });
      return holidaying;
    });
}

getHolidayingDinosaurs("2016-12-20").then((holidaying) => console.log(holidaying));
Run Code Online (Sandbox Code Playgroud)

在客户端上执行进一步过滤没有直接的替代方法,因为您只能使用单个属性查询Firebase,并且组合日期不是特别有用,因为开始和结束可以是在之前或之后的任何日期查询日期.

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

如果上述方法导致在客户端上检索和过滤太多信息,您可以付出一些额外的努力,并通过存储一些如下结构的其他数据来维护您自己的度假恐龙映射:

"holidays": {
  ...
  "2016-12-19": {
    "stegosaurus": true
  },
  "2016-12-20": {
    "lambeosaurus": true,
    "stegosaurus": true
  },
  "2016-12-21": {
    "lambeosaurus": true
  },
  ...
}
Run Code Online (Sandbox Code Playgroud)

Firebase的多位置更新可用于使映射更容易维护(此答案中有更多多位置示例):

firebase.database().ref().update.({
  "dinosaurs/lambeosaurus": {
    "vacationStart" : "2016-12-20",
    "vacationEnd" : "2016-12-25",
    "length" : 12.5,
    "weight": 5000
  },
  "holidays/2016-12-20/lambeosaurus": true,
  "holidays/2016-12-21/lambeosaurus": true,
  "holidays/2016-12-22/lambeosaurus": true,
  "holidays/2016-12-23/lambeosaurus": true,
  "holidays/2016-12-24/lambeosaurus": true,
  "holidays/2016-12-25/lambeosaurus": true
});
Run Code Online (Sandbox Code Playgroud)

然后,查询holidays/2016-12-20将返回一个带有每个假日恐龙键的对象.