在Node.js中快速加载是我知道如何使用Sequelize的唯一方法。我正在尝试从一个带有嵌套包含的MySQL数据库中导出所有用户调查数据。调查答案超过500k行,由于为返回的每一行创建一个示例,我的脚本因内存不足而崩溃。
我想让查询“原始”,只获取简单的对象数据,但它只返回每个include的第一个关联记录,而不是包含所有关联记录的数组。有没有办法获取所有关联记录,同时也让它成为原始的?或者Sequelize不应该以这种方式用于大型查询?下面是我的查询:
db.User.findAll({
include: [
{ model: db.Referrer }, // has one Referrer
{ model: db.Individual }, // has many Individuals (children)
{
model: db.UserSurvey, // has many UserSurveys
include: {
model: db.Answer, // UserSurveys have many Answers
include: {
model: db.Question // survey question definition
}
}
}
],
raw: true // only returns first Individual, UserSurvey, Answer, etc.
nest: true // unflattens but does not fix problem
})
如果我限制返回的行数,这个查询可以正常工作。如果我不限制它,它只会因为数据集的大小而崩溃。我试过将raw添加到顶层和各种include中的任何地方,但似乎都不起作用。我应该尝试将查询基于Answer吗?所以所有的关系只需要一个单一的记录?或者有没有一种方法可以使这些复杂的查询原始,并包括所有相关的记录?感谢阅读,这件事把我难倒了好几天。
2条答案
按热度按时间vohkndzv1#
正如Sequelize文档中关于
raw
选项所述:sequelize不会尝试设置查询结果的格式,也不会根据结果构建模型的示例
这意味着如果你有1个主记录和2个关联记录,你会得到2个记录,因为这是Sequelize从SQL-query得到的。
我想在你的情况下,你应该在一个循环中使用
limit
和offset
选项,通过块来获取记录。这样你就不会导致内存不足的结果。同样,要获取普通对象而不是模型,请对每个模型使用
get({ plain: true })
,如下所示:z9smfwbn2#
不要使用
raw: true
,这将导致大量的序列化问题。使用
toJSON()
代替