在子数组上使用“where”和“in”时出现续集错误

Posted

技术标签:

【中文标题】在子数组上使用“where”和“in”时出现续集错误【英文标题】:Sequelize error when using "where" and "in" on a subarray 【发布时间】:2014-09-15 05:23:06 【问题描述】:

这是我的模型定义:

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 表达式与子数组一起使用,就像在这种情况下一样。所以我不知道这是否是正确的做法。

【问题讨论】:

【参考方案1】:

我知道这已经很老了。但我很确定您要寻找的内容如下。至少其中一个应该可以解决问题。大概两者兼而有之。我目前无法测试,因为我正处于一个 43 文件更改的意大利面条代码野兽中间。有时间我会用实际测试更新。

(我现在发帖是因为其他人似乎并没有真正回答所提出的问题,但他们确实回答了我到达这里时提出的问题。)

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) 

    ...
);

【讨论】:

【参考方案2】:

Sequelize v5 的更新示例:

await Tag.findAll(
  where: 
    id: 
      [Sequelize.Op.in]: [1, 2, 3, 4]
    
  
);

【讨论】:

只要确保它是 static 方法而不是对象可访问的方法。 值得注意的是Shorthand syntax for Op.in section,例如:id: [1,2,3] // Same as using id: [Op.in]: [1,2,3] 【参考方案3】:

in 属性可以在 4.42 版本中使用

Tag.findAll(
    where:  id: in: [1,2,3,4] 
).then(...)

您可以将notIn 属性用于排除值。

Tag.findAll(
    where:  id: notIn: [1,2,3,4] 
).then(...)

http://docs.sequelizejs.com/manual/querying.html#operators

【讨论】:

【参考方案4】:

替换为$in

where :  id :  $in : [1,2,3,4]

【讨论】:

上述贡献者 (Jaddu) 将其答案中的语法与 MongoDB 的类似 $in 运算符混淆了。它与 Sequelize 提供的 in 运算符不同,上面 Enxtur 提供的答案完全消除了运算符以支持数组值是问题的正确解决方案。 他们并没有将它与 MongoDB 混淆,他们的答案在 2018 年仍然有些合理。sequelize.org/v4/manual/tutorial/querying.html“出于向后兼容性的原因,Sequelize 默认设置以下别名 - $eq, $ne, $gte , $gt, $lte, $lt, $not, $in, $notIn..." 我在这里寻找其他东西,但它突出了。【参考方案5】:

不需要“in”属性,后续自动定义这个。只需设置数组即可。

Tag.findAll(
    where: 
        id: [1,2,3,4]
    
).then(...)

【讨论】:

我的问题中的最后一段代码(您正在“修复”的代码)已经可以了。请阅读整篇文章:) Enxtur,我用 findAll 进行了尝试,只有这样才能显示该数组中具有 id 的所有记录。否则,只会显示 id 的值等于数组中第一个元素的值的记录。谢谢您的帮助!这非常有用! Tag.findAll( where: id: [0,1,2,3] ).then( tag => res.json( tag ); ); @Emanuelacolta 这是被误解的问题和错误的答案,导致我的英语不好。但我很高兴它对某人有用:)

以上是关于在子数组上使用“where”和“in”时出现续集错误的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate:在子选择查询中使用 IN 子句时出现错误

在子表 Laravel 中插入数据时出现外键问题

警惕 MySql 更新 sql 的 WHERE 从句中的 IN() 子查询时出现的性能陷阱

python:使用pip安装时出现Fatal error in launcher错误

尝试选择两列时出现 np.where 错误

tomcat部署新的项目启动时出现报错信息: Invalid byte tag in constant pool: 15