使用Sequelize.js查询JSONB数组

时间:2016-09-29 02:47:10

标签: postgresql sequelize.js

我正在开发各种工作流引擎,其中管理员可以构建一组工作流程步骤,这些步骤已应用条件,然后用户可以启动项目并启动相应的步骤。

conditional对象基本上具有以下关键点:

  • 如果conditional.isDefaulttrue,那么它适用于所有项目
  • 否则,conditional会有数字fieldNameoperandvalue字段,字符串只有fieldNamevalue字段匹配(即由美国国家选择列表定义的state字段)

我有一个直接的SQL查询(下面)可以工作并说明我在做什么,但我很好奇两件事:

1)是否可以使用sequelize而不是使用原始sql来执行此操作?

2)让postgres执行这些操作是否更高效,或者将整个工作流程步骤集合到我的nodejs应用程序然后在javascript中迭代数组会更高效吗?

这是SQl查询,显示我想要对单个JSONB字段中包含的数据数组做什么(注意:我不是超级熟练的w / SQL,特别是postgres的新手 - 所以这可能是各种错了!):

WITH steps(projId, step) AS (
    SELECT
        ppr.id AS projId,
        jsonb_array_elements(ppr."workflowSteps") AS step
    FROM "provider_project_ruleset" AS ppr
)
SELECT ARRAY(SELECT
    jsonb(steps.step)
FROM 
    steps
WHERE 
    steps.step -> 'conditional' @> '{"isDefault": true}'
    OR (step -> 'conditional' ->> 'fieldName' = 'state' AND step -> 'conditional' ->> 'value' = 'TN')
    OR (step -> 'conditional' ->> 'fieldName' = 'amount' AND
        (CASE step -> 'conditional' ->> 'operand'
            WHEN '>=' THEN CASE WHEN  (step -> 'conditional' ->> 'value')::bigint <= 10000000000 THEN 0 ELSE 1 END
            WHEN '<=' THEN CASE WHEN (step -> 'conditional' ->> 'value')::bigint >= 10000000000 THEN 0 ELSE 1 END
            WHEN '=' THEN CASE WHEN (step -> 'conditional' ->> 'value')::bigint = 10000000000 THEN 0 ELSE 1 END
            ELSE 1
        END) = 0
    )
)

0 个答案:

没有答案