为什么 [Op.and] 在这种情况下使用 Sequelize 不起作用?

Why is [Op.and] not working in this instance using Sequelize?

我有一个 table 图像,每个图像都有很多标签(注意 - 每个标签在标签 table 中是单独的一行,其中包含标签名称和置信度值 - 所以这意味着相同标签文本的许多不同行,例如“cat”可以存在,每一行都有不同的置信度值。

我想查询包含 2 个或更多标签的所有图像。查找标签名称为“cat”和“dog”的所有图像。

型号

const Tag = sequelize.define("tag", {
        name: {
            type: Sequelize.TEXT('tiny')
        },
        value: {
            type: Sequelize.STRING
        },
    });

const Frame = sequelize.define("frame", {
        location: {
            type: Sequelize.STRING,
            allowNull: false
        }
    });

关系

db.projects.hasMany(db.frames, { onDelete: 'CASCADE', hooks: true })
db.frames.belongsTo(db.projects, {
    foreignKey: "projectId",
    as: "project"
});

db.frames.hasMany(db.tags, { onDelete: 'CASCADE', hooks: true });
db.tags.belongsTo(db.frames, {
    foreignKey: "frameId",
    as: "frame",
})
module.exports = db;

控制器

// form query (search?tags=cat;dog) into an array
var tagQuery = req.query.tag.split(";")

// form query
Frame.findAll({
            include: {
                model: Tag,
                where: {
                    name: {
                        [Op.and]: tagQuery
                    }
                },

            }
        })
        .then(data => {
            res.json(data)
        })

预期的行为是仅返回匹配“cat”和“dog”的帧。实际行为是不返回任何帧,即使记录同时包含“cat”和“dog”

改变

[Op.and]

[Op.any]

具有返回所有在查询中具有任何匹配项的帧的预期行为。

我尝试了什么

正在使用

[Op.overlap]

这会导致以下错误:

error: SequelizeDatabaseError: operator does not exist: text && text[]

将标记名称类型更改为 STRING,没有任何区别。

为了检查某个帧是否具有所有指示的标签,您应该在主 where 选项中执行子查询,而不是在 include 选项内的 where 选项中执行子查询:

where: sequelize.where(sequelize.literal(`
(SELECT count(*) 
 from tags 
 where tags.frameId=frame.id 
   and tags.name IN (<place all tags here in single quotes separated by comma>)
)`), '=', tagQuery.length)