ビジネス名を含む多数のレコードがあり、すべての重複を検索するためにクエリを実行したいと考えています。これはどのように行うことができますか?
{:business/name "<>"}
ビジネス名を含む多数のレコードがあり、すべての重複を検索するためにクエリを実行したいと考えています。これはどのように行うことができますか?
{:business/name "<>"}
属性値に一意性を強制しようとしている場合は、代わりに:db/unique
スキーマ属性を確認する必要があります。
重複した値とそれらが繰り返される頻度を見つけるには、次を使用します。
(->> (d/datoms db :aevt :business/name)
(map :v)
(frequencies)
(filter #(> (second %) 1)))
これは、datomic.api/datoms
API を使用して未加工の AEVT インデックスにアクセスし、:business/name
属性値をストリーミングし、それらの頻度を計算し、いくつかの基準 (複数の出現) に基づいてフィルタリングします。また、データログおよび集計関数を使用して同じ結果を得ることができます。
(->> (d/q '[:find (frequencies ?v)
:with ?e
:in $ ?a
:where [?e ?a ?v]]
db :business/name)
(ffirst)
(filter #(> (second %) 1)))
属性値が重複しているエンティティを見つけるには、次を使用します。
(->> (d/datoms db :aevt :business/name)
(group-by :v)
(filter #(> (count (second %)) 1))
(mapcat second)
(map :e))
d/datoms
また、 API を活用してそれを実現します。データログの実装を含む完全なコード サンプルについては、https: //gist.github.com/a2ndrade/5641681 を参照してください。