2015-03-02 58 views
2

當查詢Datomic數據庫,結果是一樣的東西從哈希集合轉換爲Keyworded列表

#{["Rainbows are many droplets acting as one" 17592186045438] 
    ["Perception is malleable and changeable" 17592186045421] 
    ["Dream preservation and posture" 17592186045440]} 

什麼是簡單的方法來從#轉換{}散列設置爲()列表,以便我可以使用列表操作像(nth-rand lst)就可以了?

而且,我如何關鍵字化不同的片段,使它們看起來像:title,:content,:time等等?

回答

1

要創建一個有序集合,您可以執行類似於排序的操作,以便控制集合最終的實際順序。

您將不得不手動映射它並創建包含關鍵字作爲關鍵字的哈希映射,查詢引擎不支持返回哈希映射。

考慮到所有這些因素,我可能會首先創建地圖,然後再進行排序以提高可讀性。

(->> (d/q '[:find ?name ?eid :where [...]] db) 
    (map (fn [[name eid]] {:name name :eid eid})) 
    (sort-by :eid)) 

您通常落得像這些映射函數自己的小圖書館,因爲你基本上與調用datomic同行的lib什麼時候對應於傳統數據庫的JDBC層工作。

+0

非常有見地,謝謝你的清楚闡述。這是有道理的,你說直接與jdbc的較低級別工作,感謝提及! (= – sova 2015-03-02 21:52:59

+0

請問爲什麼在地圖行中有[[name eid]]的方括號加倍? – sova 2015-03-02 21:53:46

+1

這是「參數分解」當你在一個集合上映射一個函數時,你的函數需要在你的情況下,一個元素是一個具有2個值的向量'''blah blah「123123]'。這種結構化簡化了代碼,避免你顯式訪問向量的第一個和第二個元素。 – 2015-03-02 22:36:39