我正在尝试为我正在构建的队列系统执行嵌套的firebase查询。我们的目标是获得一个“站点”列表,然后查询“项目”。与给定的“站点”相匹配。然后显示数据,以便我的“站点”与与该站点匹配的“项目”列在该站点下。我的数据结构如下:
projects
-LYFLi59ZFTcHHNGEl4Y
-LYFNmlW_fDOxOGep1VT
SKU: "66534"
buyerEmail: "guy@internet.com"
comments: "comment"
createdAt: 1549684385662
queue: 1
station: "Lathe"
timeTest: "Fri Feb 08 2019"
stations
-LYCB7awMyE7gxRKlojN
StationtName: "Lathe"
-LYCCBjC4JT9rZlgJSiL
-LYCCD0J6VqafpRL8Mlf在这种情况下,我正在寻找的产品是equalTo“车床”,并在“车床”队列中展示它们。
现在,我有一个返回所有站点的列表:
this.stationRef = firebase.database().ref('stations/');
this.stationRef.on('value', resp => {
this.stations = [];
this.stations = snapshotToArray(resp);
}); 然后,我有了另一个ref,它返回所有按stations排序的项目,并且等于stations数组中的Station值。
this.projectRef = firebase.database().ref('projects/')
.orderByChild('station')
.equalTo(------this.Is My Problem-----); ///// Looking for this.stationId ////
this.projectRef.on('value', resp => {
this.projects = [];
this.projects = snapshotToArray(resp);
});我使用下面的代码来返回要传递给projectRef的站点的值,但是我不能在循环外获取变量,也不能在循环内使用projectRef。
const snapshotToArray = snapshot => {
let returnArr = [];
snapshot.forEach(childSnapshot => {
let item = childSnapshot.val();
item.key = childSnapshot.key;
this.stationId = childSnapshot.val().StationtName;
<--------------------------------------->
this.stationId is the
variable I want to pass
into the projectRef
<---------------------------------------->
returnArr.push(item);
});
return returnArr;
} 提前感谢您的帮助!我是不是遗漏了什么最佳实践,或者解决问题的方式错了?
再次感谢..
发布于 2019-02-10 02:41:20
Firebase的核心是完全扁平化数据结构(NO-SQL)。但与此同时,复杂的查询一直是firebase的痛点,这就是为什么他们要求我们为复杂的查询结构使用firestore。
据我所知,您想在这里列出站点及其产品的子列表。实现一次同步的最好方法是将项目id/名称的数组放入工作站。因此,您只监听station节点,它有包含所有项目ID数组,只需显示站点列表,并使用array显示项目的子列表,只需使用ID点击打开项目的详细信息。
stations id- stationName产品:{ prod1,prod2,prod3 }
但是,如果你想在同一个屏幕上显示所有产品的信息,也只需要加载所有产品(如果不是数百万个其他产品,就转移到firestore)。一次并将其保存在地图中,使用键和值作为产品本身,并使用它显示信息。除非迫不得已,否则不要在firebase中进行嵌套查询
https://stackoverflow.com/questions/54608598
复制相似问题