Datomic.query.EntityMap может возвращать обратную ссылку на сущность.Тем не менее, поведение выходит за рамки моего прямого ожидания.Это ошибка? - PullRequest
0 голосов
/ 25 февраля 2019

Мы можем получить обратную сущность ref :db/id, используя datomic.api/touch на datomic.query.EntityMap.Однако после вызова функции 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«])

1 Ответ

0 голосов
/ 12 апреля 2019

Это, вероятно, не ошибка.Имейте в виду, что Datomic нигде не хранит сущности, все, что она хранит, это факты.Представление EntityMap содержит «фальшивку» :db/id, но ваши данные на самом деле выглядят так:

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

Таким образом, тот факт, что идентификатор теряется при преобразовании его в seq, может показаться непреднамеренным/ случайное поведение, но на самом деле не ошибка как таковая.

Обратите внимание, что вам не нужно использовать d/touch, чтобы получить идентификатор - вы можете просто прочитать идентификатор напрямую.

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