首页 > 解决方案 > 如何使用 knex 从 mysql 中的 ARRAY_AGG 中删除引号

问题描述

我正在使用 knex 并尝试使用 and 查询对象JSON_ARRAYAGG数组JSON_OBJECT。不幸的是,返回的整个数组JSON_ARRAYAGG都用单引号括起来,我似乎无法摆脱它们。

我的查询看起来与此非常相似:

let data = await knex('table1')
    .join('table2')
    .where({ 'table1.id': id })
    .select(
      'a',
      'b',
      knex.raw(
        'JSON_ARRAYAGG(json_object("c", c, "d", d)) ->> $.itemArr AS itemArr',
      ),
    )
    .groupBy('id');

我尝试过执行以下操作:

  1. ->>运营商,
  2. ->+ _JSON_UNQUOTE
  3. knex.raw('CAST(JSON_ARRAYAGG(json_object('c', c, 'd', d)) AS JSON ) AS itemArr')
  4. knex.raw('CAST(JSON_ARRAYAGG(json_object('c', c, 'd', d)) AS itemArr) AS JSON ')
  5. knex.raw('JSON_UNQUOTE(JSON_EXTRACT(JSON_ARRAYAGG(json_object('c', c, 'd', d))), $.specialties) AS JSON ')

我对 mySQL 很陌生,所以我不知道这是否正确,但根据我在 SO 上找到的其他帖子,这些是建议的解决方案。任何帮助,将不胜感激

注意: -> 和 ->> 运算符给了我一个解析错误。

编辑:使用 $.itemArr 作为路径时,我也会收到未知列字段错误。

标签: mysqlknex.jsmysql-json

解决方案


我设法弄清楚该怎么做。我不确定这是否是最有效的方法,但我刚刚结束了以下帖子所做的事情:https ://github.com/knex/knex/issues/2416 。

本质上,我在连接到 knex 时最终添加了以下内容:

typeCast: function (field, next) {
      if (field.type === 'JSON') {
        return (JSON.parse(field.string()))
      }
      return next()
    }

据我了解,当查询结果是 JSON 类型时,它会自动为我解析。


推荐阅读