我正在尝试为正在构建的队列系统执行嵌套的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
在这种情况下,我正在寻找等于“车床”的产品,并将其显示在“车床”队列中。
现在,我有一个列表可以返回我的所有电台:
this.stationRef = firebase.database().ref('stations/');
this.stationRef.on('value', resp => {
this.stations = [];
this.stations = snapshotToArray(resp);
});
然后我有另一个引用,它返回按桩号排序的所有项目,并等于stations数组中的桩号。
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;
}
预先感谢您的帮助!我是否错过了任何最佳做法或以错误的方式来解决问题?
再次感谢..
答案 0 :(得分:1)
Firebase的核心是完全扁平化数据结构(NO-SQL)。但是同时,复杂查询一直是firebase的痛点,这就是为什么他们要求我们使用firestore来获取复杂查询结构的原因。
据我所知,您想在列表中列出其产品的子列表。实现一次同步的最佳方法是将项目ID /名称的数组放入工作站。因此,您只收听站点节点,它具有所有项目ID的数组,并仅显示站点列表,并使用数组显示项目的子列表,仅使用该ID只需轻按打开项目的详细信息即可。
台站- ID- 站名 产品:{ prod1,prod2,prod3 }
但是,如果您想在同一屏幕上显示产品的所有信息,则只需加载所有产品(如果数量不超过百万,则移至Firestore。)一次,然后使用键和值作为产品本身将其保存在地图中,并用于显示信息。 除非确实需要
,否则不要在firebase中进行嵌套查询