mysql - Sequelize : How to make use of multiple operators to create a fetch of objects with an exclusion clause

标签 mysql node.js angular express sequelize.js

我在使用 MySQL 的 NodeJS/Express/Angular7 应用程序中使用 Sequelize 5。

我有一个图像表,通过连接表与关键字表具有双向 hasMany 关系。

我想要查找在 ID 数组 [kewordsAnd] 中包含关键字 ID 的所有图像,排除在数组中包含关键字 ID 的图像以排除 [keywordsNot] .

现在的代码如下:

Image.findAll({
  include: [ {
    model: Keywords,
    as: 'Keywords',
    attributes: ['id', 'name'],
    where: {
      id: {
        [Op.and]: [
          { [Op.in]: keywordsAnd },
          { [Op.notIn]: keywordsNot }
        ]
      }
    }
  } ]
});

这会正确获取 keywordsAnd 数组中包含 ID 的所有图像,但 keywordsNot 数组会被完全忽略。

这是生成的 SQL(为了便于阅读而添加换行符)

const objectsAnd:  [ 430 ]
const objectsNot:  [ 779 ]
Executing (default): 

SELECT `image`.`id`, `image`.`status`, `image`.`image_type`, `image`.`embed`, 
`image`.`raw_path`, `image`.`thumb_path`, `image`.`detail_path`, `image`.`story_title`, 
`image`.`image_title`, `image`.`original_filename`, `image`.`description`, 
`image`.`geo_info`, `image`.`year_taken`, `image`.`credit_info`, 
`image`.`width`, `image`.`height`, `image`.`format`, `image`.`duration`, 
`image`.`created_at` 

AS `createdAt`, `image`.`updated_at` AS `updatedAt`, `keywords`.`id` AS `keywords.id`, 
`keywords`.`name` AS `keywords.name`, `keywords`.`created_at` AS `keywords.createdAt`, 
`keywords`.`updated_at` AS `keywords.updatedAt`, `keywords->image_keywords`.`id` AS 
`keywords.image_keywords.id`, `keywords->image_keywords`.`image_id` AS 
`keywords.image_keywords.image_id`, `keywords->image_keywords`.`keyword_id` AS 
`keywords.image_keywords.keyword_id`, `keywords->image_keywords`.`created_at` AS 
`keywords.image_keywords.createdAt`, `keywords->image_keywords`.`updated_at` AS 
`keywords.image_keywords.updatedAt` 

FROM `image` AS `image` INNER JOIN ( `image_keywords` AS `keywords->image_keywords` 
INNER JOIN `keywords` AS `keywords` 
ON `keywords`.`id` = `keywords->image_keywords`.`keyword_id`) 
ON `image`.`id` = `keywords->image_keywords`.`image_id` 
AND (`keywords`.`id` IN (430) AND `keywords`.`id` NOT IN (779));

我不清楚这是否是我构建查询的方式的问题,或者是一个错误,或者是我对它应该如何工作的完全误解,但我真的希望得到一些指导。

最佳答案

根据下面的示例数据,您是否只期望得到图像 1(而不是图像 2)的结果?

image id    keyword id
1           430
2           430
2           709

如果是这样,则问题出在您的查询上。您需要选择关键字 ID 为 709 的图片 ID,并将其用作 NOT IN 语句的基础。

关于mysql - Sequelize : How to make use of multiple operators to create a fetch of objects with an exclusion clause,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56047760/

相关文章:

Node.js 执行在重启后卡住

javascript - 在转发到代理目标并将响应发送回客户端之前编辑 POST 参数

html - 如何在 Angular 6 中单击图像更改边框半径

mysql 替换某些条目的字符串片段

mysql - 如何为多个用户使用单个表

c# - 在 Code First Entity Framework 中为数据库中的现有列添加属性到模型

angular - 'value' 应该是一个有效的 JavaScript Date 实例

php - 选择 Doctrine (Symfony 2) 中一列为 false 的所有内容

node.js - 如何忽略 MongoDB 中的查询字段

angular - Angular 5 中使用 rxjs 进行持久订阅