我的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和剑龙)?或者我应该以不同方式存储数据?如果是这样,我应该如何存储数据以获得最佳性能?感谢。
答案 0 :(得分: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
}
}
如果vacationEnd
在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));
之后vacationEnd
的任何恐龙将在该假日休假:
"holidays": {
...
"2016-12-19": {
"stegosaurus": true
},
"2016-12-20": {
"lambeosaurus": true,
"stegosaurus": true
},
"2016-12-21": {
"lambeosaurus": true
},
...
}
在客户端上执行进一步过滤没有直接的替代方法,因为您只能使用单个属性查询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
});
查询可能会在服务器上执行大部分过滤 - 除非您有很多恐龙提前计划好他们的假期。
如果上述方法导致在客户端上检索和过滤过多信息,您可以付出一些额外的努力,并通过存储一些像这样构建的其他数据来维护您自己的度假恐龙映射:
holidays/2016-12-20
Firebase的多位置更新可用于使映射更容易(this answer中有更多多位置示例):
saver.restore(sess, "/full/path/to/model.ckpt")
saver.restore(sess, "./model.ckpt")
上的查询将返回一个带有每个假日恐龙键的对象。
答案 1 :(得分:0)
我建议以不同的方式存储数据。将一个属性用于&#34; vacationStart&#34;一个用于&#34; vacationEnd&#34;。而且,把所有的恐龙都放在一个恐龙&#34; dinousaurs&#34;节点,而不是根节点。
因此,为了查询将于2016-12-20度假的所有恐龙,您将使用查询:
var query = firebase.database().ref('dinousaurs').orderByChild('vacationStart').equalTo('2016-12-20');