2015-03-18 3 views
2

Итак, у меня есть сообщения, которые помечены тегами, и я бы хотел, чтобы пользователи могли добавлять теги, а затем я хотел бы сделать запрос и получить агрегированный список тегов для отдельных сообщений. (В настоящее время поведение просто возвращает список лиц, каждый из которых имеет разные: приписывать теги.)слияние определенных атрибутов в результатах датомического запроса

({:title "Straight edges ...", 
    :content "If you ever ... ", 
    :tags "folding",    <<< + 
    :eid 1759} 
{:title "Straight edges ...", 
    :content "If you ever ...", 
    :tags "art",     <<< + 
    :eid 1759} 
{:title "Straight edges ...", 
    :content "If you ever ... ", 
    :tags "scissor-less edges", <<< + 
    :eid 1759} 
{:title "Straight edges ...", 
    :content "If you ever ... ", 
    :tags "snips",    <<< + 
    :eid 1759} 
{:title "Straight edges ...", 
    :content "If you ever ... ", 
    :tags "scissor-less edges", <<<^How to combine? 
    :eid 1759}) 

Мой запрос выглядит

(defn get-post-by-eid [eid] 
    (->> (d/q '[:find ?title ?content ?tags ?eid 
       :in $ ?eid 
       :where 
      [?eid post/title ?title] 
      [?eid post/content ?content] 
      [?eid post/tag ?tags]] (d/db conn) eid) 
     (map (fn [[title content tags eid]] 
      {:title title 
       :content content 
       :tags tags 
       :eid eid})) 
     (sort-by :eid))) 

Желаемый результат что-то вроде

({:title "Straight edges ...", 
    :content "If you ever ... ", 
    :tags "folding, art, scissor-less edges, snips", ;;combination 
    :eid 1759} 

Любые советы о том, как я могу запросить это, или как я могу объединить все результаты запроса? Заранее спасибо

ответ

3

Я лично люблю совмещать sort-bypartition-by и merge-with для подобных вещей, хотя в данном случае, так как все то же самое между записями, кроме тегов, которые можно пропустить шаг слияния и просто наклеить правильно: теги значение в любой произвольный элемент списка (я выбрал первый)

user> (->> 
     '({:title "Straight edges ...", 
      :content "If you ever ... ", 
      :tags "folding",    
      :eid 1759} 
     {:title "Straight edges ...", 
      :content "If you ever ...", 
      :tags "art",     
      :eid 1759} 
     {:title "Straight edges ...", 
      :content "If you ever ... ", 
      :tags "scissor-less edges", 
      :eid 1759} 
     {:title "Straight edges ...", 
      :content "If you ever ... ", 
      :tags "snips",     
      :eid 1759} 
     {:title "other post edges ...", 
      :content "If you ever ... ", 
      :tags "example",     
      :eid 9999} 
     {:title "Straight edges ...", 
      :content "If you ever ... ", 
      :tags "scissor-less edges", 
      :eid 1759}) 
     (sort-by :eid) 
     (partition-by :eid) 
     (map #(assoc (first %) 
        :tags (clojure.string/join ", " (map :tags %)))) 
     pprint) 

который производит последовательность сообщений с закатанными тегами:

({:title 
    "Straight edges ...", 
    :content "If you ever ... ", 
    :tags "folding, art, scissor-less edges, snips, scissor-less edges", 
    :eid 1759} 
{:title "other post edges ...", 
    :content "If you ever ... ", 
    :tags "example", 
    :eid 9999}) 
+0

Отлично !!! Большое спасибо. – sova

Смежные вопросы