EMQX 规则引擎JQ用法

利用规则引擎SQL:
SELECT
jq(
'{type: .Payload[0].DataType | split(“-”)[0],
body: {keywords: .Payload[0].DataType | split(“-”)[1],
param: .Payload[0].Data | map({(.Param): .Value | tonumber}) | add}}
',
payload
) as pd
FROM
“RUNING/System/Publish”

实现将:
{
“MessageId”: “Recipe#BZ-2008-010691#1737601376510”,
“Command”: 3,
“Payload”: [
{
“DataType”: “cfg-timer”,
“Data”: [
{
“Param”: “id”,
“Value”: “2”
},
{
“Param”: “minute”,
“Value”: “510”
},
{
“Param”: “week”,
“Value”: “3”
},
{
“Param”: “switch”,
“Value”: “1”
},
{
“Param”: “enable”,
“Value”: “1”
}
]
}
]
}
如何转换成:
{
“type”: “cfg”,
“body”: {
“param”: {
“week”: 3,
“switch”: 1,
“minute”: 510,
“id”: 2,
“enable”: 1
},
“keywords”: “timer”
}
}
目前因为JQ返回的是数组列表,无法满足需求

SELECT
jq(
'{type: .Payload[0].DataType | split(“-”)[0],
body: {keywords: .Payload[0].DataType | split(“-”)[1],
param: .Payload[0].Data | map({(.Param): .Value | tonumber}) | add}}
',
payload
) as pd,
pd[0] as fpd
FROM
“RUNING/System/Publish”
这种写法无法获取,但是修改成以下写法就可以,为什么?
SELECT
jq(
'{type: .Payload[0].DataType | split(“-”)[0],
body: {keywords: .Payload[0].DataType | split(“-”)[1],
param: .Payload[0].Data | map({(.Param): .Value | tonumber}) | add}}
',
payload
) as pd,
first(pd)as fpd
FROM
“RUNING/System/Publish”

依据官方示例,数组是支持索引取值的,为什么这里不可以?

都支持的,规则引擎中数组的下标是从 1 开始的。你改成 pd[1]就行了。
和 JQ 里面的数组下标从 0 开始要区分开来哈。