javascript - 表达和 Sequelize : eager loading belongs to many associations hangs application

标签 javascript node.js performance express sequelize.js

我正在尝试急切加载 belongs-to-many 关联,我正在加载三个嵌套关联。这是模型,它们产生三个数据库表 programsprogramDatespeopleProgramDatesprogram.js :

module.exports = function(sequelize, DataTypes) {
  const Program = sequelize.define('program', {
    name: DataTypes.STRING
  });

  Program.associate = ({programDate}) => {
    Program.hasMany(programDate);
  };

  return Program;
};
program_date.js :
module.exports = function(sequelize, DataTypes) {
  const ProgramDate = sequelize.define('programDate', {
    date: DataTypes.DATEONLY,
    volunteerLimit: DataTypes.INTEGER
  }, {
    indexes: [
      {
        unique: true,
        fields: ['programId', 'date']
      }
    ]
  });

  ProgramDate.associate = ({program, person}) => {
    ProgramDate.belongsTo(program);
    ProgramDate.belongsToMany(person, {through: 'peopleProgramDates'});
  };

  return ProgramDate;
};

在我的 Controller 中,我想返回一个包含所有程序、programDates 和 peopleProgramDates 的对象:
const {bus, family, person, volunteerType, program, programDate} = require('../models');

exports.get = (request, response) => {
  return Promise.all([
    bus.findAll({ include: [{model: family, include: [person]}] })
        .then(buses => buses.map(addBusCount)),
    volunteerType.findAll({include: [person]})
        .then(volunteerTypes => volunteerTypes.map(addVolunteerCount)),

    // this query hangs the application
    program.findAll( { include: [{ model: programDate, include: [{association: 'peopleProgramDates'}] }]} )
        .then(programs => programs.map(processPrograms))

  ])
      .then(([buses, volunteerTypes, programs]) =>
        response.render('pages/register', {
          buses,
          volunteerTypes,
          programs
        })
      );
};

目前,processPrograms() 是一个简单地返回相同对象数组的函数,因此不应与此处相关。 addBusCountaddVolunteerCount 同样不相关。

我认为问题可能是 peopleProgram 日期不是真正的 Sequelize 模型,而是 belongsToMany through: 上的 ProgramDate 关联的结果。

This post 似乎建议我可以使用 association: 属性来从 through 关联加载数据,但是查询会挂起应用程序。

如果我从查询中删除连接表,则数据加载正常:
program.findAll( { include: [programDate] } )

加分项:最终我真正需要的只是 peopleProgramDates 对象返回的 programDate 计数。也许我可以简单地在 programDates 模型上定义这样的东西,但是也许我们可以在一个单独的问题中解决这个问题。尽管如此,如果有一个令人信服的理由使用这种方法,例如性能,那么也许我们终究应该采用这种方式。

最佳答案

解决办法是通过关联给belongsToMany添加一个别名:

// program_date.js
ProgramDate.belongsToMany(person, {through: 'peopleProgramDates', as: 'peopleProgDates'});

然后在 include 属性中引用别名:
program.findAll( { include: [{ model: programDate, include: [{association: 'peopleProgDates'}] }]} )

关于javascript - 表达和 Sequelize : eager loading belongs to many associations hangs application,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48046482/

相关文章:

mysql - 提高在 Django 中创建 MySQL 表的速度?

javascript - 无法使用 jQuery 滑动 div

javascript - 如何在 ES6/Javascript 中深度复制对象而不替换整个属性

javascript - 如何使用rabbitmq在nodejs中设计一个任务调度程序,使其在跨多个进程时不会运行相同的任务?

javascript - Node 错误堆栈跟踪未定义

android - 获取 MultiDex 错误,即使在设置 Min SDK 21 之后

javascript - ComponentWillUnmount 没有被调用 React-Navigation

javascript - Highcharts,构建 "Text"图

javascript - Stripe Payment 仅适用于我的 LocalHost,但不适用于 Heroku 服务器

javascript - 为什么设置 textContent 会导致布局抖动?