因此,我使用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}]}]}
这可以在查询级别完成吗?还是在查询返回并修改它之后需要遍历结构?我很高兴能在目前的架构上走下去,我只是想知道是否有人找到了更好的方法?