jq: добавить поле в коллекцию глубоко во вложенной структуре, рассчитанной из других полей того же уровня - PullRequest
1 голос
/ 15 февраля 2020

Я ищу кого-то, кто мог бы дать мне подсказку с jq здесь - кажется, я чего-то упускаю.

Мой JSON источник будет похож на это:

[
    {
        "cluster": "one",
        "slots": [
            {
                "instances": [
                    {
                        "number": 0,
                        "services": [
                            {
                                "name": "A",
                                "unhealthy": 0,
                                "healthy": 4
                            },
                            {
                                "name": "B",
                                "unhealthy": 2,
                                "healthy": 2
                            }
                        ]
                    },
                    {
                        "number": 1,
                        "services": [
                            {
                                "name": "B",
                                "unhealthy": 0,
                                "healthy": 6
                            },
                            {
                                "name": "C",
                                "unhealthy": 0,
                                "healthy": 2
                            }
                        ]
                    }
                ]
            }
        ]
    },
    {
        "cluster": "two",
        "slots": [
            {
                "instances": [
                    {
                        "number": 1,
                        "services": [
                            {
                                "name": "A",
                                "unhealthy": 1,
                                "healthy": 9
                            },
                            {
                                "name": "C",
                                "unhealthy": 0,
                                "healthy": 10
                            }
                        ]
                    },
                    {
                        "number": 0,
                        "services": [
                            {
                                "name": "B",
                                "unhealthy": 0,
                                "healthy": 9
                            },
                            {
                                "name": "D",
                                "unhealthy": 0,
                                "healthy": 14
                            }
                        ]
                    }
                ]
            }
        ]
    }
]

Мне нужно было бы новое поле «статус» в каждой внутренней коллекции как сумма «здоровых» и «нездоровых» состояний, например:

[
    {
        "cluster": "one",
        "slots": [
            {
                "instances": [
                    {
                        "number": 0,
                        "services": [
                            {
                                "name": "A",
                                "unhealthy": 0,
                                "healthy": 4,
                                "status": 4
                            },
                            {
                                "name": "B",
                                "unhealthy": 2,
                                "healthy": 2,
                                "status": 4
                            }
                        ]
                    },
                    {
                        "number": 1,
                        "services": [
                            {
                                "name": "B",
                                "unhealthy": 0,
                                "healthy": 6,
                                "status": 6
                            },
                            {
                                "name": "C",
                                "unhealthy": 0,
                                "healthy": 2,
                                "status": 2
                            }
                        ]
                    }
                ]
            }
        ]
    },
    {
        "cluster": "two",
        "slots": [
            {
                "instances": [
                    {
                        "number": 1,
                        "services": [
                            {
                                "name": "A",
                                "unhealthy": 1,
                                "healthy": 9,
                                "status": 10
                            },
                            {
                                "name": "C",
                                "unhealthy": 0,
                                "healthy": 10,
                                "status": 10
                            }
                        ]
                    },
                    {
                        "number": 0,
                        "services": [
                            {
                                "name": "B",
                                "unhealthy": 0,
                                "healthy": 9,
                                "status": 9
                            },
                            {
                                "name": "D",
                                "unhealthy": 0,
                                "healthy": 14,
                                "status": 14
                            }
                        ]
                    }
                ]
            }
        ]
    }
]

Есть ли способ итерировать таким образом:

jq '.[].slots[].instances[].services[] += { "status": ($iterator.healthy + $iterator.unhealthy) }'

До сих пор во всех моих попытках я не мог получить доступ к элементам на том же уровне для расчета ... или остальным мои данные были сброшены.

1 Ответ

2 голосов
/ 15 февраля 2020

Вы ищете |= оператора.

.[].slots[].instances[].services[] |= (.status = .unhealthy + .healthy)
...