Node.js 使用“继续”时出现错误;其中;及;在;在子阵列上
这是我的模型定义:Node.js 使用“继续”时出现错误;其中;及;在;在子阵列上,node.js,sequelize.js,Node.js,Sequelize.js,这是我的模型定义: var Tag = sequelize.define('Tag', { name: Sequelize.STRING }); var Event = sequelize.define('Event', { name: Sequelize.STRING, }); Event.hasMany(Tag, {as: 'tags', through: 'event_tags', foreignKey: 'eventId'}); Tag.hasMany(Event,
var Tag = sequelize.define('Tag', {
name: Sequelize.STRING
});
var Event = sequelize.define('Event', {
name: Sequelize.STRING,
});
Event.hasMany(Tag, {as: 'tags', through: 'event_tags', foreignKey: 'eventId'});
Tag.hasMany(Event, {as: 'events', through: 'event_tags', foreignKey: 'tagId'});
换句话说,这就是:有事件和标记。事件使用许多标记进行标记
我正在尝试运行此查询:
Event
.findAndCountAll({
include: [{model: Tag, as: 'tags'}],
where: {'tags.id': {in: [1,2,3,4]}},
order: order,
limit: pageSize,
offset: pageSize * (page - 1),
})
.success(function(result) {
...
});
但我得到了一个错误:
\node_modules\sequelize\lib\dialects\abstract\query-generator.js:1134
var logicResult = Utils.getWhereLogic(logic, hash[key][logic]);
^
TypeError: Cannot read property 'in' of undefined
我做错了什么
我以前使用过“in”表达式,例如:
Tag
.find({
where: {id: {in: [1,2,3,4]}}
}).success(...)
而且效果很好。不过,我从未将in表达式与子数组一起使用过,就像在本例中一样。所以我不知道这样做是否正确。不需要“in”属性,sequelize自动定义它。只需设置数组
Tag.findAll({
where: {
id: [1,2,3,4]
}
}).then(...)
将中替换为
$in
where : { id : { $in : [1,2,3,4]}}
在
属性中,可以在版本4.42中使用
Tag.findAll({
where: { id: {in: [1,2,3,4]} }
}).then(...)
您可以对排除的值使用notIn
属性
Tag.findAll({
where: { id: {notIn: [1,2,3,4]} }
}).then(...)
更新了Sequelize v5的示例:
await Tag.findAll({
where: {
id: {
[Sequelize.Op.in]: [1, 2, 3, 4]
}
}
});
我知道这是hella old。但我很确定你要找的东西如下。至少其中一个应该能起作用。可能两者都有。我现在无法测试,因为我正处于43档改成意大利面代码野兽的中间。当我找到时间时,我会用实际的测试来更新 (我现在发帖是因为其他人似乎都没有回答我提出的问题,但他们确实回答了我到达这里时的问题。)
我问题中的最后一段代码(您正在“修复”的代码)已经可以了。请阅读整篇文章:)Enxtur,我用findAll试过了,只有这样才能显示该数组中具有id的所有记录。否则,将仅显示id值等于数组中第一个元素值的记录。谢谢你的帮助!它非常有用!findAll({where:{id:[0,1,2,3]}})@这是一个被误解的问题和错误的答案,因为我的英语不好。但我很高兴它对某些人有用:)上面的贡献者(Jaddu)将他们答案中的语法与MongoDB中类似的
$in
操作符混淆了。这与Sequelize提供的操作符中的不同,上面的Enxtur提供的答案是正确的解决方案,它完全消除了操作符而支持数组值。他们没有将其与MongoDB混淆,他们的答案在2018年仍然是合理的。“出于向后兼容的原因,Sequelize默认设置以下别名-$eq、$ne、$gte、$gt、$lte、$lt、$not、$in、$notIn…”我在这里寻找其他东西,但这一点很突出。只需确保它是静态的
方法非对象可访问方法。
Event
.findAndCountAll({
include: [{model: Tag, as: 'tags'}],
where: {
tags: {
id: {in: [1,2,3,4]}
}
},
order: order,
limit: pageSize,
offset: pageSize * (page - 1),
})
.success(function(result) {
...
});
Event
.findAndCountAll({
include: [
{
model: Tag,
as: 'tags',
where: { id: {in: [1,2,3,4]} },
}
],
order: order,
limit: pageSize,
offset: pageSize * (page - 1),
})
.success(function(result) {
...
});