`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)
我们可以通过在 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)