为什么 [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)
我有一个 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)