Поэтому я использую queries
для фильтрации данных, а затем pull
для получения информации из базы данных Datomic.
(def rules
[[[search ?txt ?id] [(fulltext $ :artist/name ?txt) [[?id]]]]
[[search ?txt ?id] [(fulltext $ :track/name ?txt) [[?id]]]]])
(d/q
'[:find [(pull ?id [* {:track/artists [:db/id :track/name] :track/_artists [:db/id :artist/name] }]) ...]
:in $ % ?query
:where [search ?query ?id]]
db rules "John Lennon")
И иногда эти запросы могут быть рекурсивными, поэтому, например, я могуизмените pull
на:
(d/q
'[:find [(pull ?id [* {:track/artists [:db/id :track/name] :track/_artists [* {:track/artists [:db/id :track/name]}]}]) ...]
:in $ % ?query
:where [search ?query ?id]]
db rules "John Lennon")
Теперь я хотел бы убедиться, что уникальные объекты возвращаются вместе со структурой :db/id
, поскольку я не хочу возвращать дублирующиеся данные какнасколько это возможно.
Например: (результаты исключены с ...)
{:entities [{:db/id 1 :track/name "..." ...} {:db/id 2 :track/name "..." ...} {:db/id 3 :artist/name "..." ...}]
:structure [{:db/id 1 :track/artists [{:db/id 3}]} {:db/id 2 :track/artists [{:db/id 3}]}]}
Можно ли это сделать на уровне запроса?Или мне нужно пройтись по структуре после возврата запроса и изменить его?В настоящее время я рад пройтись по структуре, мне просто интересно, разработал ли кто-нибудь лучший подход?