Spe*_*ros 9 mysql node.js sequelize.js serverless-framework
使用子查询向 Sequelize 查询添加限制无法限制检索。多个在线资源引用了此错误,但没有解决方案。这是 Sequelize 错误还是用户错误?
ThreadFolderUser.findAll({
order: [
['updated_at', 'DESC']
],
where: {
user_id,
folder_id,
deleted,
archived,
},
distinct: true,
offset,
limit: 10,
include: [
{
model: Thread,
include: [
{ model: Email, include: [Attachment] },
]
}
],
Run Code Online (Sandbox Code Playgroud)
})
// ThreadFolderUser (assoc table) - Thread / Folder / User (tables)
User.hasMany(ThreadFolderUser, { foreignKey: 'user_id' })
ThreadFolderUser.belongsTo(User, { foreignKey: 'user_id' })
Folder.hasMany(ThreadFolderUser, { foreignKey: 'folder_id' })
ThreadFolderUser.belongsTo(Folder, { foreignKey: 'folder_id' })
Thread.hasMany(ThreadFolderUser, { foreignKey: 'thread_id' })
ThreadFolderUser.belongsTo(Thread, { foreignKey: 'thread_id' })
// Thread - Emails
Thread.hasMany(Email, { foreignKey: 'thread_id' })
Email.belongsTo(Thread, { foreignKey: 'thread_id' })
// Email - Attachments
Email.hasMany(Attachment, { foreignKey: 'email_id' })
Attachment.belongsTo(Email, { foreignKey: 'email_id' })
Run Code Online (Sandbox Code Playgroud)
我期望从 AssociationTable 检索 10 条记录(基于当前设置为 10 的限制),因为数据库中至少有 15 条记录与此查询匹配。
在我的例子中返回 6,而不是 10(限制设置为 10)。而不是拉掉前10场比赛。
如果我删除limit,它会按预期工作(即使包含在内)。
如果我删除include,它会按预期工作(即使有限制)。
如果我复制/粘贴 Sequelize 生成的 SQL 查询并将其直接插入到 Workbench 中,它将检索适当数量的行。
问题似乎是限制与包含相结合导致查询仅检索在数据库中搜索的前 10 条中匹配的记录。
没有提供适当解决方案的对同一问题的其他参考:
我很清楚,这个完全相同的问题已经在多个其他线程和平台中提出——正如我在上面链接了其中一些——但是它们都没有直接的答案,并且其中一个标记了不相关的点作为答案并没有解决预期的问题。我希望我们能够得到这个问题的答案,或者除了对 SQL 查询进行硬编码(最后的手段)之外的实际解决方法。
Sequelize 无法处理同一查询中包含的限制是不可想象的,所以我这边肯定有一些缺失/用户错误。我已经搜索了多次,当然是从 Sequelize 文档开始的,其中没有引用这个问题或类似的示例,也没有引用限制和包含相结合可能出现的任何问题。
非常感谢为帮助解决此问题所做的贡献。希望@Sequelize 工程师能够帮助回答这个问题:)
Ana*_*oly 21
在您通过单独的查询进行续集以获取包含的关联对象之前,您无法正确限制包含 hasMany 关联的续集查询。在您的查询中,您已包含关联Thread.hasMany(Email,因此您应该在电子邮件包含中指示separate: true,如下所示(这也适用于附件关联):
include: [
{
model: Email,
separate: true,
include: [{
model: Attachment,
separate: true
}] },
]
Run Code Online (Sandbox Code Playgroud)
另外,您不需要指示unique: true,因为我们已经指示将 hasMany 关联分离到其自己的查询中。
hasMany 的另一个问题是在查询中包含(尤其是嵌套的 hasMany),它们在 SQL 查询中转换为 JOIN,这意味着数据库将一定数量的主记录乘以一定数量的嵌套记录,依此类推。例如:100 个主记录,每个主记录有 100 个链接记录,每个记录都有自己的链接 100 个记录(主题 -> 电子邮件 -> 附件)。总而言之,您创建一个数据库来一次查询 100*100*100 - 100 万条记录!它通常会导致内存不足。
关于 LIMIT 和 hasMany:数据库选择 100 条主记录,每条记录有 100 条链接(一次 10000 条记录),之后从这 10000 条记录中获取前 10 条记录(而不是从 100 条主记录中)。这就是 SQL 查询的工作原理!
| 归档时间: |
|
| 查看次数: |
11837 次 |
| 最近记录: |