Exact unordered match of multi-valued string field

The issue is you need set equality on the actual set

(d/q '[:in $ ?needle
       :find (pull ?e [:community/name :community/category])
       :where
       [?e :community/category]
       [(datomic.api/entity $ ?e) ?fat]
       [(get ?fat :community/category) ?cs]
       [(= ?cs ?needle)]]
     $ #{"events" "news"})
=>
[[#:community{:name "belltown", :category ["events" "news"]}]
 [#:community{:name "Greenwood Blog", :category ["events" "news"]}]]

You can also define your own peer functions (if peer):

(defn f [$ e needle]
  (let [en (->> e (d/entity $) :community/category)]
    #_(println needle en)
    (= needle en)))

(->> (d/q '[:in $ ?needle
            :find (pull ?e [:community/name :community/category])
            :where
            [?e :community/category]
            [(user/f $ ?e ?needle)]]
          $ #{"events" "news"}))
=> #'user/f
=>
[[#:community{:name "belltown", :category ["events" "news"]}]
 [#:community{:name "Greenwood Blog", :category ["events" "news"]}]]
2 Likes