2013-06-17 4 views
1

내 mongodb 스키마에 JSON 계층 구조가 있습니다. compojure에서 필드 매개 변수를 가져 오면 해시는 {"a.b" 1, "a.c" 2, "d.e" 3}과 같이 평평한 점으로 구분 된 표기법으로 표시됩니다. monger를 사용하여 데이터를 삽입하려고하지만, {:a {:b 1, :c 2}, :d {:e 3}}과 같은 실제 계층 구조 형식이 필요합니다. 자동으로 변환하는 방법이 있습니까? 나는Clojure는 monger 계층 구조로 생성/딸꾹질을 위해 { "ab"1, "ac"2, "de"3}을 {: a {: b 1, : c 2}, : d {: e 3}

답변

3

아무것도 자동으로 알고 있지만, 수동으로 변환을 수행하는 매우 간단합니다 :

=> (require 'clojure.string) 
=> (defn nest-keys [x] 
    (reduce (fn [m [k v]] 
       (assoc-in m (map keyword (clojure.string/split k #"\.")) v)) 
      {} 
      x)) 
=> (nest-keys {"a.b" 1 "a.c" 2 "d.e" 3}) 
{:d {:e 3}, :a {:c 2, :b 1}} 
+0

정말 좋은! 당신은 똑같이 간결한 역변환을 생각해 낼 수있는 기회가 있습니까? – lobsterism

+0

역 논리는 다소 까다 롭지 만 여기에 나와 있습니다. https://gist.github.com/alexhall/5799651 – Alex