我对实体及其时间戳感兴趣。本质上,我想要一个按时间排序的实体列表。
为此,我编写了以下功能:
(defn return-posts
"grabs all posts from Datomic"
[]
(d/q '[:find ?title ?body ?slug
:where
[?e :post/title ?title]
[?e :post/slug ?slug]
[?e :post/body ?body]] (d/db connection)))
(defn get-postid-from-slug
[slug]
(d/q '[:find ?e
:in $ ?slug
:where [?e :post/slug ?slug]] (d/db connection) slug))
(defn get-post-timestamp
"given an entid, returns the most recent timestamp"
[entid]
(->
(d/q '[:find ?ts
:in $ ?e
:where
[?e _ _ _]
[?e :db/txInstant ?ts]] (d/db connection) entid)
(sort)
(reverse)
(first)))
我觉得这一定是根植于无知的骇客。
会不会有人更熟悉惯用的Datomic使用方法并升级我的范例?
最佳答案
我为在名义上将时间理解为一流原理的数据库中添加其他时间戳的想法感到困扰,因此(经过一整天的思考后,Ulrik Sandberg概述的方法)发展了以下功能:
(defn return-posts
"grabs all posts from Datomic"
[uri]
(d/q '[:find ?title ?body ?slug ?ts
:where
[?e :post/title ?title ?tx]
[?e :post/slug ?slug]
[?e :post/body ?body]
[?tx :db/txInstant ?ts]] (d/db (d/connect uri))))
在Datalog中,惯常做法是忽略与事务ID本身的绑定,这是我们通常不关心的。在这种情况下,我们非常关心并且用August Lileaas的话说,希望“遍历交易”(在某些情况下,我们需要创建帖子的时间,但是对于该应用程序,交易时间足以订购实体)。
这种方法的一个显着缺点是,最近编辑的条目将在列表中突出显示。为此,我将在以后做一些事情,以使它们在Datomic中“首次出现”,用于博客标准的帖子历史记录。
总结一下:
我已经为每个“发布”实体ID绑定了交易实体ID,然后使用此函数查找了交易时间戳,以便以后进行排序。
关于clojure - 从Datomic检索最新实体,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19071694/