使用graphql-bookshelf优化书架的使用

时间:2017-07-20 10:58:20

标签: node.js bookshelf.js graphql-js

我创建了一个小例子,其中模型如下所示

Student --- hasMany ---> Homework --- hasMany -----> Page

现在,当我加载以下内容时(注意:查看者是学生),学生有一个查询,一个用于作业,但多个用于页面。查询的页数与页数一样多。我如何优化它,以便所有页面只有一个查询。

最好的情况是立即加载整个事情,但我很乐意提供有关如何优化此事的任何指示。

{ 
 viewer(id: 3) {
    name
    homeworks{
      subject
      pages{
        content
      }
    }
  }
}

我用来测试此代码的代码可在https://gist.github.com/hardfire/3ff69d3a602bf3c30dcbbca71d67d605

获得

1 个答案:

答案 0 :(得分:0)

从我过去几天学到的东西来看,用书架来做这件事是不可能的,而且graphql的哲学不允许这样的事情。

最好的选择是使用dataloader。将它与书架一起使用应该是直截了当的。我将不得不使用它来找出使用它的最佳模式。

页面的示例加载器类似于

var PageLoader = new Dataloader(keys => {
 return Page
  .where('homework_id', 'IN', keys)
  .fetchAll()
  .then(collection => {
    var groupedItems = _.groupBy(collection.models, (el) => el.get('homework_id'))
    return _.map(keys, key => groupedItems[key])
  })
})

然后可以在HomeworkType

中使用它
...
pages: {
  type: new GraphQLList(PageType),
  description: 'pages in the homework',
  resolve: (homework) => PageLoader.load(homework.id)
},
...