`Datomic.query.EntityMap` 可以 return 反向实体引用。但是,这种行为超出了我的直接预期。这是一个错误吗?

`Datomic.query.EntityMap` can return reverse entity reference. However, the behavior is out of my direct expectation. Is it a bug?

我们可以通过在 datomic.query.EntityMap 上使用 datomic.api/touch 来检索反向实体引用 :db/id。但是调用seq函数后,:db/id键会消失。

像这样考虑我的代码:

(d/touch (first (get-allo-customers-by-user  (d/db conn)  [:user/email "aaa@example.com"])))

=> {:db/id 17592186045460, :customer/id 101, :customer/name "AAA"}

然而奇怪的事情是这样发生的:

(seq (d/touch (first (get-allo-customers-by-user  (d/db conn)  [:user/email "aaa@example.com"])))) 

=> ([:customer/id 101] [:customer/name "AAA"])

这可能不是错误。请记住,Datomic 不会在任何地方存储实体,它存储的只是事实。 EntityMap 表示包含 "fake" :db/id,但您的数据实际上看起来像这样:

[17592186045460 :customer/id 101]
[17592186045460 :customer/name "AAA"]

因此,当您将其转换为 seq 时,id 丢失这一事实似乎是 unintended/random 行为,但本身并不是真正的错误。

请注意,您不必使用 d/touch 来获取 ID - 您可以直接读取 ID。

(def customer (first (get-allo-customers-by-user (d/db conn) [:user/email "aaa@example.com"])))
(:db/id customer)