续集:在json数组中查找

时间:2018-06-25 14:26:41

标签: node.js postgresql sequelize.js

在续集中,我有一个模型:

{
   modelId: {
      type:  DataTypes.UUID ,
      allowNull: false,
      primaryKey: true,
      defaultValue: DataTypes.UUIDV4 
    }
   name: DataTypes.STRING(1024),
   type: DataTypes.STRING,
   obj: DataTypes.JSON
}

在数据库中,我的obj是这样的数组:

[{
   id: '123456',
   text: 'test',
   name 'xpto'
},{
   id: '32554',
   text: 'test2',
   name 'xpte'
},{
   id: '36201',
   text: 'test3',
   name 'xpta'
}]

我尝试了这些:

btp.findAll({
        where: {
          obj:{
             [Op.contains]:[{id: req.body.id}]
          }
        },
        attributes: ['modelId','name','type','obj']
      })

但不起作用,返回此错误:

{"name": "SequelizeDatabaseError",
"parent": {
    "name": "error",
    "length": 128,
    "severity": "ERROR",
    "code": "42704",
    "file": "parse_coerce.c",
    "line": "1832",
    "routine": "enforce_generic_type_consistency",
     "sql":"....."}

所以,我需要在数据库中找到obj,id:'123456'中的所有条目。

我的问题与此相同: https://github.com/sequelize/sequelize/issues/7349

但是那对我不起作用,我需要返回所有包含...的条目。 我正在使用“ sequelize”:“ 4.28.6”和“ pg-hstore”:“ ^ 2.3.2”,

有什么可以帮助的吗?

1 个答案:

答案 0 :(得分:0)

我对您遇到的特定错误不熟悉,但是一个潜在的问题是您使用的是JSON列而不是JSONB。在Postgres中,JSON列仅存储原始JSON文本,因此don't support是Sequelize的“包含”所必需的包含运算符(@>)。

解决此问题所需要做的就是将模型中的列定义更改为:

obj: DataTypes.JSONB

我唯一想到的另一个问题是req.body.id的值无效。我建议验证一下它实际上是在获取有效的ID字符串。

除了这两个潜在的问题之外,您编写的查询也可以使用。