【问题标题】:In Datomic, querying field history with no retractions?在 Datomic 中,查询没有撤回的字段历史记录?
【发布时间】:2021-08-17 01:07:34
【问题描述】:

我想获取 Datomic 中特定字段的值的历史记录。 我的直觉是用(d/history)like

(d/q '[:find ?entity ?field-val ?date ?tx
       :in $
       :where 
          [?entity :namespace/field ?field-val ?tx]
          [?tx :db/txInstant ?date]]
      (d/history (db/get-db)))

但是,此查询将重复大多数值,因为它会列出每次撤回以及每次值更新(每个 db/adddb/retract)。

我想也许我可以用事务查询 datoms,然后检查操作。但我找不到查询数据的方法。

  • (d/pull db '[*] tx-id) 不包括 datoms。
  • 搜索引擎结果对诸如“查询 datomic transaction datoms”之类的关键字没有帮助
  • 搜索 datomic 事务模式没有结果

我可以使用tx-range,但这似乎不太合适。

有更好的方法吗?

【问题讨论】:

    标签: clojure datomic


    【解决方案1】:

    我找错地方了。历史查询提供了history docs 中描述的额外隐藏位置值。

    所以任何 where 子句都可以包含?entity ?attribute ?value ?transaction ?operation

    • ?操作对于:db/add 为真,对于:db/retract 为假

    所以,我想要的查询看起来像

    (d/q '[:find ?entity ?field-val ?date ?tx
           :in $
           :where 
              [?entity :namespace/field ?field-val ?tx true] ;;ADDED TRUE
              [?tx :db/txInstant ?date]]
          (d/history (db/get-db)))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-10
      • 2014-04-14
      • 2020-09-26
      • 1970-01-01
      相关资源
      最近更新 更多