使用sequelize查询Postgres嵌套JSONB列

nav*_*een 3 node.js sequelize.js sequelize-cli

您好,我有一个表,我使用 JSONB 来存储嵌套 JSON 数据,并且需要查询此 JSONB 列下面是表的结构

 {
          "id": "5810f6b3-fefb-4eb1-befc-7df11a24d997",
          "entity": "LocationTypes",
          "event_name": "LocationTypes added",
          "data": {
            "event":{
            "id": "b2805163-78f0-4384-bad6-1df8d35b456d",
            "name": "builidng",
            "company_id": "1dd83f77-fdf1-496d-9e0b-f502788c3a7b",
            "is_address_applicable": true,
            "is_location_map_applicable": true}
          },
          "notes": null,
          "event_time": "2020-11-05T10:56:34.909Z",
          "company_id": "1dd83f77-fdf1-496d-9e0b-f502788c3a7b",
          "created_at": "2020-11-05T10:56:34.909Z",
          "updated_at": "2020-11-05T10:56:34.909Z"
        }
Run Code Online (Sandbox Code Playgroud)

下面的代码给出空白数组作为响应


    const dataJson = await database.activity_logs.findAll({
          where: {
            'data.event.id': {
              $eq: 'b2805163-78f0-4384-bad6-1df8d35b456d',
            },
          },
          raw: true,
        });

Run Code Online (Sandbox Code Playgroud)

有什么方法可以更好地使用sequelize 完成查询嵌套json 对象。

Ana*_*oly 6

您应该尝试sequelize.literal将 JSON 运算符/函数包装到sequelize.where. 像这样的东西:

sequelize.where(sequelize.literal("data->'event'->'id'"), '=', 'b2805163-78f0-4384-bad6-1df8d35b456d')
Run Code Online (Sandbox Code Playgroud)

更新的语法(不确定从哪个 Sequelize 版本开始工作)来根据 JSON 构造条件:

{
  data: {
    event: {
     id: 'b2805163-78f0-4384-bad6-1df8d35b456d'
    }
  }
}
Run Code Online (Sandbox Code Playgroud)