Sequelize(或清除 SQL)查询以选择包含 JSON 字段中的值的行?

Posted

技术标签:

【中文标题】Sequelize(或清除 SQL)查询以选择包含 JSON 字段中的值的行?【英文标题】:Sequelize (or clear SQL) query for selecting rows what includes value in JSON field? 【发布时间】:2018-08-24 18:08:47 【问题描述】:

我的 mysql 中有行,我需要 Sequelize.js 查询。

每一行都有 JSON 类型的 col,例如:

[
  id: 1234, blah: "test",
  id: 3210, blah: "test",
  id: 5897, blah: "test"
]

我有id,我需要在数组中的至少一个对象中选择包含此id 的行。

【问题讨论】:

docs.sequelizejs.com/manual/tutorial/querying.html#json可能对你有帮助 【参考方案1】:

原始的 mysql 查询将是这样的:

SELECT * FROM `user` WHERE JSON_CONTAINS(`comments`, '"id": 1234');

简单的续集示例:

const  fn, col, cast  = this.sequelize;

const User = this.sequelize.define('user',   
  id: 
    type: Sequelize.INTEGER,
    primaryKey: true,
    autoIncrement: true
  ,
  comments: DataTypes.JSON,
  defaultValue: [],
)

User.findAll(
  where: fn('JSON_CONTAINS', col('comments'), cast('"id": 1234', 'CHAR CHARACTER SET utf8')),
)
.then(users => console.log('result', users.map(u => u.get())))
.catch(err => console.log('error', err));

Cast 函数用于取消转义 "id" 周围的双引号,以避免像这样的错误查询字符串:

SELECT * FROM `user` WHERE JSON_CONTAINS(`comments`, '\"id\": 1234');

还有一个脏mysql查询例子(不要用):

SELECT * FROM `user` WHERE `comments` LIKE '%"id": 1234%';

【讨论】:

如何在 JSON_CONTAINS 中使用 OR 条件?查询就像SELECT * FROM projects WHERE JSON_CONTAINS(stackholders, 2) OR owner = 1

以上是关于Sequelize(或清除 SQL)查询以选择包含 JSON 字段中的值的行?的主要内容,如果未能解决你的问题,请参考以下文章

如何在sequelize中选择案例查询?

Sequelize - 子选择关联以过滤父模型

MySQL 查询 10 个表(Sequelize 或 Raw Query)

sequelize.query 原始查询

Sequelize.js - 连接子句中的子选择

如何将 SQL 查询转换为 sequelize?