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和剑龙)?或者我应该以不同方式存储数据?如果是这样,我应该如何存储数据以获得最佳性能?谢谢.
在使数据库更易于查询方面,组合这两个日期并没有太大作用.
如果您在特定日期在假期搜索恐龙,他们可以在该日期之前的任何时间去度假.(除非有一项政策要求假期中的最大天数.)因此,结束日期可能是您要查询的内容:
{
"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)
任何具有vacationEnd
on或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
将返回一个带有每个假日恐龙键的对象.
归档时间: |
|
查看次数: |
8961 次 |
最近记录: |