2015-03-02 24 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