Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql Sequelize:如何使用关联快速加载,原始:真?_Mysql_Node.js_Sequelize.js - Fatal编程技术网

Mysql Sequelize:如何使用关联快速加载,原始:真?

Mysql Sequelize:如何使用关联快速加载,原始:真?,mysql,node.js,sequelize.js,Mysql,Node.js,Sequelize.js,在Node.js中快速加载是我知道如何使用Sequelize的唯一方法。我正在尝试使用嵌套的includes从MySQL数据库导出所有用户调查数据。有超过500k行的调查答案,我的脚本由于为返回的每一行创建一个实例而内存不足而崩溃 我想将查询设为“raw”,只获取简单的对象数据,但它只返回每个include的第一个关联记录,而不是包含它们的数组。是否有任何方法可以获取所有相关记录并使其成为原始记录?或者Sequelize不应该以这种方式用于大型查询?我的问题是: db.User.findAll(

在Node.js中快速加载是我知道如何使用Sequelize的唯一方法。我正在尝试使用嵌套的includes从MySQL数据库导出所有用户调查数据。有超过500k行的调查答案,我的脚本由于为返回的每一行创建一个实例而内存不足而崩溃

我想将查询设为“raw”,只获取简单的对象数据,但它只返回每个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中的任何地方添加,但似乎没有任何效果。我是否应该尝试根据答案进行查询,以便所有关系只需要一条记录?或者,有没有一种方法可以使这些复杂的查询成为原始查询,并包括所有相关的记录?感谢阅读,这让我困惑了好几天。

正如Sequelize文档中所说的
raw
选项:

sequelize不会尝试格式化查询结果,也不会构建 结果中的模型实例

这意味着,若您有1条主记录和2条关联记录,您将得到2条记录,因为Sequelize从SQL查询中得到了这两条记录

我想在您的例子中,您应该在一个循环中使用
limit
offset
选项来按块获取记录。这样就不会导致内存不足的结果

另外,要获取普通对象而不是模型,请对每个模型使用
get({plain:true})
,如下所示:

const users = 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
        }
      }
    }
  ]
})
const plainUsers = users.map(x => x.get({ plain: true }))

正如Sequelize文档所述,关于
raw
选项:

sequelize不会尝试格式化查询结果,也不会构建 结果中的模型实例

这意味着,若您有1条主记录和2条关联记录,您将得到2条记录,因为Sequelize从SQL查询中得到了这两条记录

我想在您的例子中,您应该在一个循环中使用
limit
offset
选项来按块获取记录。这样就不会导致内存不足的结果

另外,要获取普通对象而不是模型,请对每个模型使用
get({plain:true})
,如下所示:

const users = 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
        }
      }
    }
  ]
})
const plainUsers = users.map(x => x.get({ plain: true }))