JQ使用ETL在JSON数组中创建内部数组

JQ使用ETL在JSON数组中创建内部数组,json,jq,Json,Jq,我需要用ETL更新一个内部数组 我想在JSON树中的数组元素中创建一个新属性 差不多 前辈 几乎得到了所需的结果,但我确实需要在主JSON数组的每个项中创建多个数组 要筛选的数据 [ { "storeId": "s2", "storehouseInfo": { "id": "025453", "name": "00211 NW, OR", "maxPallets": 10 }

我需要用ETL更新一个内部数组

我想在JSON树中的数组元素中创建一个新属性

差不多 前辈 几乎得到了所需的结果,但我确实需要在主JSON数组的每个项中创建多个数组

要筛选的数据

[
 {
        "storeId": "s2",
        "storehouseInfo": {
            "id": "025453",
            "name": "00211 NW, OR",
            "maxPallets": 10
        },
        "workorder":{
            "id": "w2s2",
            "startDate": "2019-09-06T10:00:00.000Z",
            "vendorId":"v2"
        },
        "events": [    
            {
                "id": "e4",
                "storeId": "s2",
                "vendorId": "v1",
                "startDate": "2019-09-05T10:00:00.000Z",
                "endDate": "2019-09-14T00:00:00.000Z",
                "palletsUsed": 5
            },
            {
                "id": "e5",
                "storeId": "s2",
                "vendorId": "v2",
                "startDate": "2019-09-05T00:00:00.000Z",
                "endDate": "2019-09-14T00:00:00.000Z",
                "palletsUsed": 5
            },
            {
                "id": "e10",
                "storeId": "s2",
                "vendorId": "v1",
                "startDate": "2019-09-06T10:00:00.000Z",
                "endDate": "2019-09-14T00:00:00.000Z",
                "palletsUsed": 5
            },
            {
                "id": "e11",
                "storeId": "s2",
                "vendorId": "v2",
                "startDate": "2019-09-06T00:00:00.000Z",
                "endDate": "2019-09-14T00:00:00.000Z",
                "palletsUsed": 5
            },
            {
                "id": "e12",
                "storeId": "s2",
                "vendorId": "v2",
                "startDate": "2019-09-06T10:00:00.000Z",
                "endDate": "2019-09-14T00:00:00.000Z",
                "palletsUsed": 5
            }
        ]
    },
]
期望调用

.| 
  insideETL("conflictsInPeriod";
    "events";
    ( (.parent.workorder.startDate | dateDaysAgo(12*7) ) < .child.endDate)
      and
      (.child.vendorId == .parent.workorder.vendorId);
   {
     event: .child.id,
     wo_sd: .parent.workorder.startDate[:10],
     workorder_id: .parent.workorder.id
   }
)

希望这是清楚的,如果需要任何澄清。。。请发表意见。

我认为最好是在已经开发和测试过的可重用组件的基础上构建:

def etl(keyname; arrayname; cond; result):
  def etl:
    . as $parent
    | .[arrayname][]
    | { parent: $parent, child: .}
    | select(cond) | result;
 {(keyname): map(etl)}
 ;
有一种方法可以做到这一点:

def add(arrayname):
  etl(arrayname;
    "events";
    ( (.parent.workorder.startDate | dateDaysAgo(12*7) ) < .child.endDate)
      and
      (.child.vendorId == .parent.workorder.vendorId);
   {
     event: .child.id,
     wo_sd: .parent.workorder.startDate[:10],
     workorder_id: .parent.workorder.id
   }
  )
  ;

[add("conflictsInPeriod") + .[]]
def添加(arrayname):
etl(arrayname;
“事件”;
((.parent.workorder.startDate | dateDaysAgo(12*7))<.child.endDate)
和
(.child.vendorId==.parent.workorder.vendorId);
{
事件:.child.id,
wo_sd:。父项。工作订单。开始日期[:10],
workorder\u id:。父项.workorder.id
}
)
;
[添加(“冲突期间”)+.[]

有了
etl
您就有了一个可重用的组件,它可以在保持简单的同时允许多种变化

@oguz ismail你说得对,这篇文章很庞大,我试图提供输入数据和期望的输出结果,让它更清晰。还从另一个答案中删除了一些代码,而只是将链接作为参考…您已经提供的ETL解决方案非常棒™ 并且已经有了不止一个用例。但在这种特殊情况下,我需要在外部数组的每个元素中创建“conflictsInPeriod”,过滤该范围内的数组。如果使用同一元素两次而不是:
[{conflictResults:[],rest\u of_data_1…},{conflictResults:[],rest\u of_data_2}]
您将得到:
[{**all**conflictResults:[]
def etl(keyname; arrayname; cond; result):
  def etl:
    . as $parent
    | .[arrayname][]
    | { parent: $parent, child: .}
    | select(cond) | result;
 {(keyname): map(etl)}
 ;
def add(arrayname):
  etl(arrayname;
    "events";
    ( (.parent.workorder.startDate | dateDaysAgo(12*7) ) < .child.endDate)
      and
      (.child.vendorId == .parent.workorder.vendorId);
   {
     event: .child.id,
     wo_sd: .parent.workorder.startDate[:10],
     workorder_id: .parent.workorder.id
   }
  )
  ;

[add("conflictsInPeriod") + .[]]