2017-01-08 12 views
6

MongoDb nie obsługuje klawiszy z kropką. Mam hash zagnieżdżony w Ruby, który ma wiele kluczy o znaku kropki (.). Czy istnieje konfiguracja, która może być użyta do określenia zastępstwo znakowy . jak podkreślenia _ podczas wstawiania tych danych MongoDBMongodb zastępuje kropkę (.) W nazwie klucza podczas wstawiania dokumentu

Używam MongoDB z Ruby & mongo gem.

przykładem mieszania jest jak poniżej

{ 
    "key.1" => { 
      "second.key" => { 
          "third.key" => "val" 
          } 
      } 
} 
+1

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' –

+0

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

+0

Czy klucze są zawsze ciągami znaków, czy też mogą być symbolami lub inne przedmioty? –

Odpowiedz

2

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" 
      ] 
     } 
    } 
} 
+1

to wygląda obiecująco. zweryfikuje i zaakceptuje. – user3206440

0

W MongoDB, nie ma konfiguracji do obsługi kropkę w kluczu. Przed wstawieniem do kolekcji MongoDB należy wstępnie przetworzyć JSON.

Jednym podejściem jest to, że można zastąpić kropkę odpowiednikiem U + FF0E w unicode przed wstawieniem.

Mam nadzieję, że to pomoże.

Powiązane problemy