Firebase中startAt()无法过滤以纪元小时为键的存储数据怎么办
问题根源
你当前查询的路径为dev_trends/[deviceUid],该层级的直接子节点是H(湿度数据)和T(温度数据),此时调用orderByKey()是对H、T这两个键做排序过滤,自然无法命中存储在更深层级的小时数字段,达不到筛选效果。
修复方案
方案1:单独查询某一类数据(仅湿度/仅温度)
如果只需要获取某一类指标的过滤结果,直接将查询路径指向对应的指标节点即可,示例代码如下:
// 以查询湿度数据(H节点)为例 this.dbService.databaseRef.child(`dev_trends/${this.deviceUid}/H`) .orderByKey() .startAt('453615') .get().then(dataTrends => { const data = dataTrends.val(); console.log(data); });
执行后返回的就是H节点下所有键≥453615的湿度数据。
方案2:同时获取湿度、温度两类的过滤结果
Firebase Realtime Database不支持跨多个子节点同时做条件过滤,你需要分别查询H、T两个节点的过滤结果,再自行合并处理:
// 批量查询两个节点的过滤结果 Promise.all([ this.dbService.databaseRef.child(`dev_trends/${this.deviceUid}/H`).orderByKey().startAt('453615').get(), this.dbService.databaseRef.child(`dev_trends/${this.deviceUid}/T`).orderByKey().startAt('453615').get() ]).then(([hData, tData]) => { const result = { H: hData.val(), T: tData.val() } console.log(result) })
额外注意
你存储的小时数键为字符串格式,只要所有小时数字符串长度一致,orderByKey()的字典序排序结果和数字排序结果完全一致,不需要额外做类型转换。
内容的提问来源于stack exchange,提问作者Jakub Szlaur
相关产品推荐
相关产品推荐

