у меня есть значение JSON, как показано ниже:
{
"table": "table_name",
"op_type": "U",
"before": {
"AAAA": "1-1111",
"BBBB": "2022-08-31 03:57:01",
"CCCC": "2023-08-31 23:59:59"
},
"after": {
"AAAA": "1-1112",
"BBBB": "2022-08-31 10:10:34"
}
}
я хочу сделать это как я могу сделать?
{
"AAAA": "1-1112",
"BBBB": "2022-08-31 10:10:34",
"CCCC": "2023-08-31 23:59:59"
"changed_columns": "AAAA, BBBB"
}
AAAA: «Если у вас после.AAAA, возьмите AAAA еще до.AAAA», BBBB: «Если у вас после.BBBB, возьмите BBBB еще до.BBBB.
И я хочу добавить поле change_columns следующим образом:
,"changed_columns": "AAAA, BBBB"
Есть ли способ сделать это?
если оба объекта имеют CCCC, то следует взять CCCC или after.CCCC
Вы можете использовать
"after|before"
в качестве ключа в этом порядке для определения приоритета"changed_columns"
Такие как
[
{
// multiplex the attributes in order to generate three independent groups
"operation": "shift",
"spec": {
"after|before": { // this order is important to determine the precedence in the upcoming cardinality spec
"*": {
"@": "&",
"@(0)": "l.&",
"*": {
"@1": "f.&2"
}
}
}
}
},
{
// determine whether before vs. after values equal through this and next two specs
"operation": "modify-overwrite-beta",
"spec": {
"l": {
"*": "=lastElement(@(1,&))"
},
"f": {
"*": "=firstElement(@(1,&))"
}
}
},
{
"operation": "shift",
"spec": {
"*": "&",
"l|f": {
"*": {
"$": "lf.@(0)"
}
}
}
},
{
"operation": "shift",
"spec": {
"*": "&",
"lf": {
"*": {
"$": "&2.@(0)"
}
}
}
},
{
// construct an array from those newly formed keys
"operation": "shift",
"spec": {
"*": "&",
"lf": {
"*": {
"$": "changed_columns"
}
}
}
},
{
"operation": "modify-overwrite-beta",
"spec": {
"changed_columns": "=join(', ',@(1,&))"
}
},
{
"operation": "cardinality",
"spec": {
"*": "ONE"
}
},
{
"operation": "sort"
}
]
Большое спасибо, Барбарос Аби :)
Добро пожаловать @veganzombie . Есть несколько хороших ссылок о Jolt, таких как 1 , 2 , 3 , 4 , 5. Удачной учебы.
Вы можете использовать операцию shift
и получить значения after
для первого. а затем вы можете использовать значения before
. Итак, если ключи совпадают вместе, у вас есть массив с двумя элементами.
Теперь вы можете получить первый элемент для получения значений after
с помощью операций modify-overwrite-beta
и функции =firstElement
.
[
{
"operation": "shift",
"spec": {
"after": {
"*": {
"$": "changed_columns[]",
"@(1,&)": "&1"
}
},
"before": {
"*": "&"
}
}
},
{
"operation": "modify-overwrite-beta",
"spec": {
"*": "=firstElement(@(1,&))",
"changed_columns": "=join(', ',@(1,changed_columns))"
}
}
]
в этой структуре, Как я могу сравнить настраиваемые поля, а не все поля? пример: включая AAAA и BBBB, не включая CCCC. В поле change_columns могут быть столбцы, которые мне не нужны.
@veganzombie Вы можете удалить его перед сменой с помощью этой спецификации: { "operation": "remove", "spec": { "before": { "CCCC": "" } } }
Что делать, если в обоих объектах есть атрибут
CCCC
?