我会尽量清楚,但请问我是否遗漏了一些细节。
所以我有一个我继承的应用程序,它运行缓慢。它是在前端使用Angular和Typescript构建的,Loopback处理我们的CRUD操作和Mongo DB。我们隔离了缓慢的原因之一,因为多余的REST调用(有时可能有数万个),所以我正在考虑减少这个。我找到的第一个是一个相对较小的一个,所以我希望它能帮助我学习,但我已经遇到了挑战。为简单起见,删除了描述,表名和更精细的细节。
在第一页上,我们向用户显示他们有权访问的区域的链接列表。这存储在"区域"表。我们在类似于此的函数中拉回所有区域:
this.ourApi.areas.find({
"filter": {
"include": ["generalInfo"]
/*
This table is related to most tables and
holds things like version numbers - it
is not relevant to this question
*/
}
}).$promise.then((returnedAreas) => {
/* Stuff */
});
在我们拥有所有区域之后,我们必须获得这些区域链接的一些配置值(主要是图标)。我们的配置表包含许多项目的配置数据,而不仅仅是区域。因此,为了获得相关的配置信息,我们遍历returnedAreas
,并为每个区域获取relatedId
与areaId
匹配的配置。有点像这样:
return this.ourApi.configs.find({
"filter": {
"where": {
"relatedId": areaId
},
"include": ["generalInfo"]
}
}).$promise.then((areaConfigurations) => {
/* Stuff */
});
理想情况下,我希望将其压缩为一次调用(然后在整个应用程序中模仿此模式)。我们真正关心的唯一事情(以及我们实际使用的唯一对象)是配置对象,所以我们真的不需要"区域"对象。我无法解决的挑战是如何调整上面的第二个调用(获取配置),以便它首先获取区域,然后在查询中使用areaId来获取我关心的数据。在SQl中,这很容易,但我无法从文档中找到它。
基本上,我正在寻找与Loopback相当的:
SELECT * FROM configs WHERE relatedId IN (SELECT areaId FROM areas)
这可能吗?