gpt4 book ai didi

Firebase 查询某个日期范围内的数据

转载 作者:行者123 更新时间:2023-12-02 09:12:35 26 4
gpt4 key购买 nike

我的 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
}
}

我如何查询 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 当天或之前,则任何在 2016-12-20 当天或之后出现 vacationEnd 的恐龙都将在该日期度假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));

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

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

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

"holidays": {
...
"2016-12-19": {
"stegosaurus": true
},
"2016-12-20": {
"lambeosaurus": true,
"stegosaurus": true
},
"2016-12-21": {
"lambeosaurus": true
},
...
}

Firebase 的多位置更新可用于使维护映射变得更加容易(this answer 中有更多多位置示例):

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

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

关于Firebase 查询某个日期范围内的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41381948/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com