Фильтрация дочернего массива по атрибуту в Logic Apps

У меня есть образец полезных данных, который я получаю от сторонней конечной точки. Используя Logic Apps, я хочу вернуть подмножество этих данных. Вот как выглядит моя сторонняя полезная нагрузка

{
    "SearchSummary": {
        "TotalRecordsFound": 48,
        "Offset": 0,
        "RecordsReturned": 48,
        "DatabaseInfo": {
            "ReleaseNumber": "43",
            "UpdateNumber": "431",
            "UpdateDate": "2024-08-20T00:00:00",
            "VersionNumber": "129.00",
            "IndexationDate": null
        },
        "Sort": null
    },
    "Data": [
        {
            "birthdate": "1950-06-01T00:00:00",
            "firstName": "Ian",
            "middleName": "Charlie",
            "lastName": "Jones",
            "dirId": "P003577888",
            "MEMBERSHIP_DATA": [
                {
                    "companyId": null,
                    "companyName": null,
                    "startDate": null,
                    "status": null,
                    "endDate": null,
                    "title": null,
                    "dept": null
                }
            ]
        },
        {
            "birthdate": "1919-05-11T00:00:00",
            "firstName": "Dorothy",
            "middleName": "June",
            "lastName": "Perkins",
            "dirId": "P003890700",
            "MEMBERSHIP_DATA": [
                {
                    "companyId": null,
                    "companyName": null,
                    "startDate": null,
                    "status": null,
                    "endDate": null,
                    "title": null,
                    "dept": null
                }
            ]
        },
        {
            "birthdate": "1947-11-09T00:00:00",
            "firstName": "Paul",
            "middleName": "Dean",
            "lastName": "Doe",
            "dirId": "P003890600",
            "MEMBERSHIP_DATA": [
                {
                    "companyId": "GB04969800",
                    "companyName": "Acme Ltd 1",
                    "startDate": "2020-04-15T00:00:00",
                    "status": "Previous",
                    "endDate": "2021-04-15T00:00:00",
                    "title": "Director",
                    "dept": "Board of Directors; Senior management"
                },
                {
                    "companyId": "GB07346800",
                    "companyName": "Acme Ltd 2",
                    "startDate": "2010-08-16T00:00:00",
                    "status": "Current",
                    "endDate": null,
                    "title": "Director",
                    "dept": "Board of Directors; Senior management"
                }
            ]
        }
    ]
}

В моем приложении логики я хочу запросить это, а затем вернуть только массив «Данные». В дополнение к этому я хочу фильтровать любые наши объекты MEMBERSHIP_DATA, если MEMBERSHIP_DATA.Status = Previous.

Так, например, из моего образца полезных данных выше первая запись о членстве Пола Доу должна быть удалена в моем возвращенном ответе. Вот как выглядит мое определение приложения логики

{
    "definition": {
        "$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#",
        "actions": {
            "Create_CompanyContact_Array": {
                "inputs": {
                    "variables": [
                        {
                            "name": "CompanyContacts",
                            "type": "array",
                            "value": "@body('Parse_JSON')?['Data']"
                        }
                    ]
                },
                "runAfter": {
                    "Parse_JSON": [
                        "SUCCEEDED"
                    ]
                },
                "type": "InitializeVariable"
            },
            "HTTP": {
                "inputs": {
                    "headers": {
                        "ApiToken": "XXX"
                    },
                    "method": "GET",
                    "uri": "https://companytest.free.beeceptor.com/contact"
                },
                "runAfter": {},
                "type": "Http"
            },
            "Loop_Contacts": {
                "actions": {
                    "Loop_Membership": {
                        "actions": {
                            "Filter_array": {
                                "inputs": {
                                    "from": "@items('Loop_Contacts')?['MEMBERSHIP_DATA']",
                                    "where": "@equals(items('Loop_Membership')['Status'],'Current')"
                                },
                                "type": "Query"
                            }
                        },
                        "foreach": "@items('Loop_Contacts')?['MEMBERSHIP_DATA']",
                        "type": "foreach"
                    }
                },
                "foreach": "@variables('CompanyContacts')",
                "runAfter": {
                    "Create_CompanyContacts_Array": [
                        "SUCCEEDED"
                    ]
                },
                "type": "foreach"
            },
            "Parse_JSON": {
                "inputs": {
                    "content": "@body('HTTP')",
                    "schema": {
                        "properties": {
                            "Data": {
                                "items": {
                                    "properties": {
                                        "MEMBERSHIP_DATA": {
                                            "items": {
                                                "properties": {
                                                    "companyId": {
                                                        "type": [
                                                            "string",
                                                            "null"
                                                        ]
                                                    },
                                                    "companyName": {
                                                        "type": [
                                                            "string",
                                                            "null"
                                                        ]
                                                    },
                                                    "dept": {
                                                        "type": [
                                                            "string",
                                                            "null"
                                                        ]
                                                    },
                                                    "endDate": {
                                                        "type": [
                                                            "string",
                                                            "null"
                                                        ]
                                                    },
                                                    "startDate": {
                                                        "type": [
                                                            "string",
                                                            "null"
                                                        ]
                                                    },
                                                    "status": {
                                                        "type": [
                                                            "string",
                                                            "null"
                                                        ]
                                                    },
                                                    "title": {
                                                        "type": [
                                                            "string",
                                                            "null"
                                                        ]
                                                    }
                                                },
                                                "type": "object"
                                            },
                                            "type": "array"
                                        },
                                        "birthdate": {
                                            "type": [
                                                "string",
                                                "null"
                                            ]
                                        },
                                        "dirId": {
                                            "type": [
                                                "string",
                                                "null"
                                            ]
                                        },
                                        "firstName": {
                                            "type": [
                                                "string",
                                                "null"
                                            ]
                                        },
                                        "lastName": {
                                            "type": [
                                                "string",
                                                "null"
                                            ]
                                        },
                                        "middleName": {
                                            "type": [
                                                "string",
                                                "null"
                                            ]
                                        }
                                    },
                                    "type": "object"
                                },
                                "type": "array"
                            },
                            "SearchSummary": {
                                "properties": {
                                    "DatabaseInfo": {
                                        "properties": {
                                            "IndexationDate": {},
                                            "ReleaseNumber": {
                                                "type": "string"
                                            },
                                            "UpdateDate": {
                                                "type": "string"
                                            },
                                            "UpdateNumber": {
                                                "type": "string"
                                            },
                                            "VersionNumber": {
                                                "type": "string"
                                            }
                                        },
                                        "type": "object"
                                    },
                                    "Offset": {
                                        "type": "integer"
                                    },
                                    "RecordsReturned": {
                                        "type": "integer"
                                    },
                                    "Sort": {},
                                    "TotalRecordsFound": {
                                        "type": "integer"
                                    }
                                },
                                "type": "object"
                            }
                        },
                        "type": "object"
                    }
                },
                "runAfter": {
                    "HTTP": [
                        "SUCCEEDED"
                    ]
                },
                "type": "ParseJson"
            },
            "Response": {
                "inputs": {
                    "body": "@variables('CompanyContacts')",
                    "statusCode": "@outputs('HTTP')?['statusCode']"
                },
                "kind": "Http",
                "runAfter": {
                    "Loop_Contacts": [
                        "SUCCEEDED"
                    ]
                },
                "type": "Response"
            }
        },
        "contentVersion": "1.0.0.0",
        "outputs": {},
        "triggers": {
            "When_a_HTTP_request_is_received": {
                "kind": "Http",
                "type": "Request"
            }
        }
    },
    "kind": "Stateless"
}

Приложение возвращает объект Data, но не фильтрует, как описано выше, и возвращает все строки MEMBERSHIP_DATA. Может ли кто-нибудь объяснить, что я делаю неправильно?

Но для выполнения сценария Java вам необходимо иметь учетную запись интеграции, интегрированную с приложением логики.

RithwikBojja 22.08.2024 10:40

@RithwikBojja Нет, это стандартное приложение логики, поэтому вам не нужна учетная запись интеграции для выполнения кода JavaScript.

10p 22.08.2024 11:10

Ох, ладно @10p

RithwikBojja 22.08.2024 11:11
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
0
3
53
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

В моем приложении логики я хочу запросить это, а затем вернуть только массив «Данные». В дополнение к этому я хочу фильтровать любые наши объекты MEMBERSHIP_DATA, если MEMBERSHIP_DATA.Status = Previous.

Вы можете использовать для этого дизайн ниже:

В Compose я сохранил ваши данные.

Затем:

Схема Parse_Json:

{
    "type": "object",
    "properties": {
        "SearchSummary": {
            "type": "object",
            "properties": {
                "TotalRecordsFound": {
                    "type": "integer"
                },
                "Offset": {
                    "type": "integer"
                },
                "RecordsReturned": {
                    "type": "integer"
                },
                "DatabaseInfo": {
                    "type": "object",
                    "properties": {
                        "ReleaseNumber": {
                            "type": "string"
                        },
                        "UpdateNumber": {
                            "type": "string"
                        },
                        "UpdateDate": {
                            "type": "string"
                        },
                        "VersionNumber": {
                            "type": "string"
                        },
                        "IndexationDate": {}
                    }
                },
                "Sort": {}
            }
        },
        "Data": {
            "type": "array",
            "items": {
                "type": "object",
                "properties": {
                    "birthdate": {
                        "type": "string"
                    },
                    "firstName": {
                        "type": "string"
                    },
                    "middleName": {
                        "type": "string"
                    },
                    "lastName": {
                        "type": "string"
                    },
                    "dirId": {
                        "type": "string"
                    },
                    "MEMBERSHIP_DATA": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "companyId": {},
                                "companyName": {},
                                "startDate": {},
                                "status": {},
                                "endDate": {},
                                "title": {},
                                "dept": {}
                            },
                            "required": [
                                "companyId",
                                "companyName",
                                "startDate",
                                "status",
                                "endDate",
                                "title",
                                "dept"
                            ]
                        }
                    }
                },
                "required": [
                    "birthdate",
                    "firstName",
                    "middleName",
                    "lastName",
                    "dirId",
                    "MEMBERSHIP_DATA"
                ]
            }
        }
    }
}

затем следующие действия:

Выход:

Ответ принят как подходящий

Если вы не хотите иметь дело с несколькими действиями For_each, самый простой способ отфильтровать массив данных, оставив только элементы MEMBERSHIP_DATA со статусом = «Предыдущий», — это использовать действие Выполнить код JavaScript следующим образом:

const data = workflowContext.actions.Parse_JSON.outputs.body.Data

const filteredData = data.map(function(item) {
    var newItem = Object.assign({}, item);
    newItem.MEMBERSHIP_DATA = item.MEMBERSHIP_DATA.filter(item => item.status === "Previous");
    return newItem;
  });

return filteredData

Результат:

[
  {
    "MEMBERSHIP_DATA": [],
    "birthdate": "1950-06-01T00:00:00",
    "dirId": "P003577888",
    "firstName": "Ian",
    "lastName": "Jones",
    "middleName": "Charlie"
  },
  {
    "MEMBERSHIP_DATA": [],
    "birthdate": "1919-05-11T00:00:00",
    "dirId": "P003890700",
    "firstName": "Dorothy",
    "lastName": "Perkins",
    "middleName": "June"
  },
  {
    "MEMBERSHIP_DATA": [
      {
        "companyId": "GB04969800",
        "companyName": "Acme Ltd 1",
        "dept": "Board of Directors; Senior management",
        "endDate": "2021-04-15T00:00:00",
        "startDate": "2020-04-15T00:00:00",
        "status": "Previous",
        "title": "Director"
      }
    ],
    "birthdate": "1947-11-09T00:00:00",
    "dirId": "P003890600",
    "firstName": "Paul",
    "lastName": "Doe",
    "middleName": "Dean"
  }
]

Если результат не соответствует вашим ожиданиям, вы можете соответствующим образом скорректировать код JavaScript.

В приведенном примере результаты не фильтруются. Я подтвердил, что элементы используют одни и те же имена.

InvalidSyntax 22.08.2024 14:08

@InvalidSyntax, я проверил код, прежде чем опубликовать ответ. Это полный код рабочего процесса, который я использовал для тестирования: coderstool.com/cs/C3aPB4

10p 22.08.2024 14:39

Хорошо, я только что протестировал тот же рабочий процесс, который вы создали, он работает. Дело в том, что мой ответ возвращает исходное тело Parse_JSON вместо вывода JS. Возможно ли, чтобы я мог перебрать CompanyContacts и сохранить изменения непосредственно в этой переменной?

InvalidSyntax 22.08.2024 15:33

@InvalidSyntax Требование в вашем вопросе заключалось в том, чтобы приложение логики возвращало подмножество массива «Данные», полученное из сторонней конечной точки. Код JavaScript достигает этого. Вы можете изменить ответ приложения логики, чтобы он возвращал выходные данные JavaScript вместо тела Parse_JSON. Повторение CompanyContacts кажется ненужным. Учитывая ваше знакомство с JavaScript, вы можете при необходимости настроить код/выходные данные.

10p 22.08.2024 16:05

Чтобы ответить на ваш вопрос о сохранении изменений непосредственно в переменной: да, вы можете использовать действие Set variable: Learn.microsoft.com/en-us/azure/logic-apps/…

10p 22.08.2024 16:05

Другие вопросы по теме