Jeżeli nie jest możliwe użycie klawiszy ze .
w MongoDB, musisz zmodyfikować danych wejściowych:
hash = {
'key.1' => {
'second.key' => {
'third.key' => 'val.1',
'fourth.key' => ['val.1', 'val.2']
}
}
}
Przekształcanie kluczami tekstowymi
Ta metoda rekurencyjna przekształca klucze zagnieżdżona Hash:
def nested_gsub(object, pattern = '.', replace = '_')
if object.is_a? Hash
object.map do |k, v|
[k.to_s.gsub(pattern, replace), nested_gsub(v, pattern, replace)]
end.to_h
else
object
end
end
nested_gsub(hash)
powraca:
{
"key_1" => {
"second_key" => {
"third_key" => "val.1",
"fourth_key" => [
"val.1",
"val.2"
]
}
}
}
Przekształcanie klucze i wartości
to możliwe, aby dodać więcej przypadków do poprzedniej metody:
def nested_gsub(object, pattern = '.', replace = '_')
case object
when Hash
object.map do |k, v|
[k.to_s.gsub(pattern, replace), nested_gsub(v, pattern, replace)]
end.to_h
when Array
object.map { |v| nested_gsub(v, pattern, replace) }
when String
object.gsub(pattern, replace)
else
object
end
end
nested_gsub
będzie teraz iterację na wartości ciągów i tablic:
{
"key_1" => {
"second_key" => {
"third_key" => "val_1",
"fourth_key" => [
"val_1",
"val_2"
]
}
}
}
To znaczy, możesz odwzorować hash całkiem po prostu, zakładając, że 'h' jest twoim hash' h.map {| k, v | [k.gsub ('.', '_'), v]}. to_h' –
działa to dla kluczy pierwszego poziomu, a nie dla struktury zagnieżdżonej w przykładzie, który właśnie dodałem – user3206440
Czy klucze są zawsze ciągami znaków, czy też mogą być symbolami lub inne przedmioty? –