Hello,
I'm trying to rename the fields coming from a jdbc_streaming and has a target like [field1][nestedField],
in my document I get a list with the result of the query, since the jdbc_streaming filter plugin don't have the option "lowercase_column_names" i can't set up the names I want in the query and all comes back with lowercase.
So now I have this:
{
"_source": {
"field1": {
"nestedField": [{
"lowercase1": "value1",
"lowercase2": "value2"
},
{
"lowercase1": "value3",
"lowercase2": "value4"
}
]
}
}
}
for my end result I want this:
{
"_source": {
"field1": {
"nestedField": [{
"camelCase1": "value1",
"camelCase2": "value2"
},
{
"camelCase1": "value3",
"camelCase2": "value4"
}
]
}
}
}
i tried to use the mutate rename plugin with no success.
I used it like this:
mutate {
rename => {
"[field1][nestedField][lowercase1]" => "[field1][nestedField][camelCase1]"
"[field1][nestedField][lowercase2]" => "[field1][nestedField][camelCase2]"
}
}
What am I doing wrong?
Thanks in advance for any help!
1 Like
Your examples aren't valid JSON so it's hard to understand what your events actually look like.
Sorry @magnusbaeck , I messed up the curly braces.
I have this:
{
"_source": {
"field1": {
"nestedField": [{
"lowercase1": "value1",
"lowercase2": "value2"
},
{
"lowercase1": "value3",
"lowercase2": "value4"
}
]
}
}
}
And I want this:
{
"_source": {
"field1": {
"nestedField": [{
"camelCase1": "value1",
"camelCase2": "value2"
},
{
"camelCase1": "value3",
"camelCase2": "value4"
}
]
}
}
}
I tried to do it like this:
mutate {
rename => {
"[field1][nestedField][lowercase1]" => "[field1][nestedField][camelCase1]"
"[field1][nestedField][lowercase2]" => "[field1][nestedField][camelCase2]"
}
}
nestedField is an array, so you need to index into it.
"[field1][nestedField][0][lowercase1]" => "[field1][nestedField][0][camelCase1]"
1 Like
Hey @Badger , thanks for the anwer but that does not work for me, changes nothing, I still get the lowercase names
Badger
June 5, 2018, 11:34am
6
With this configuration
filter { json { source => "message" } }
input { generator { message => '{
"field1": {
"nestedField": [{
"lowercase1": "value1",
"lowercase2": "value2"
},
{
"lowercase1": "value3",
"lowercase2": "value4"
}
]
}
}' count => 1 } }
output { stdout { codec => rubydebug } }
filter {
mutate {
rename => {
"[field1][nestedField][0][lowercase1]" => "[field1][nestedField][0][camelCase1]"
"[field1][nestedField][0][lowercase2]" => "[field1][nestedField][0][camelCase2]"
}
}
}
I get
"field1" => {
"nestedField" => [
[0] {
"camelCase1" => "value1",
"camelCase2" => "value2"
},
[1] {
"lowercase2" => "value4",
"lowercase1" => "value3"
}
]
},
What does stdout { codec => rubydebug } produce for your messages?
Hey @Badger ,
the thing is i don't want to change only the first element, I want to change the name of all elements inside the array.
your solution only changes the first element.
Badger
June 5, 2018, 11:43am
8
The mutate+rename example you gave in the first post only renamed the first array entry. I showed you how to fix that example.
If that's not the problem you want to solve please explain what you do want to solve.
The mutate-rename example in my first post changes nothing, but I think I was clear with the examples I provided, what I have vs want I want.
I feel I'm getting closer,
I've found on another post a way to do it but somehow it's not working for me.
I used the filter ruby plugin like this
filter {
if([field1][nestedField]){
ruby {
code => "
event.get('[field1][nestedField]').each { |k|
k['camelCase1'] = k['lowercase1']
k['camelCase2'] = k['lowercase2']
k.delete('lowercase1')
k.delete('lowercase2')
logger.info('for each k', 'value' => k)
}
logger.info('full array' , 'value' => event.get('[field1][nestedField]'))
"
}
}
}
The thing is when I print "k" in the logger it's exactly has I want it to be but when I print the whole array nothing has changed.
Am I missing some kind of set?
Badger
June 5, 2018, 6:45pm
11
Try this
code => "
b = []
event.get('[field1][nestedField]').each { |k|
k['camelCase1'] = k['lowercase1']
k['camelCase2'] = k['lowercase2']
k.delete('lowercase1')
k.delete('lowercase2')
logger.info('for each k', 'value' => k)
b << k
}
event.set('[field1][nestedField]', b)
"
6 Likes
Yes @Badger that did the trick!
Thank you for your help.
system
(system)
Closed
July 3, 2018, 7:15pm
13
This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.