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

Мы можем получить обратный объект :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"])

0 ответов

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

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

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

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

(def customer (first (get-allo-customers-by-user (d/db conn) [:user/email "aaa@example.com"])))
(:db/id customer)
Другие вопросы по тегам