我有以下数据:
({:seriesId "series 0", :episodeId "0"}
{:seriesId "series 1", :episodeId "1"}
{:seriesId "series 1", :episodeId "2"}
{:seriesId "series 2", :episodeId "3"}
{:seriesId "series 2", :episodeId "4"}
{:seriesId "series 2", :episodeId "5"})
Run Code Online (Sandbox Code Playgroud)
并希望将每集与其系列相关联,如下所示:
[{:put-request
{:item {:seriesId "series 0", :episodeCount 1, :episodeIds #{"0"}}}}
{:put-request
{:item {:seriesId "series 1", :episodeCount 2, :episodeIds #{"1" "2"}}}}
{:put-request
{:item {:seriesId "series 2", :episodeCount 3, :episodeIds #{"3" "4" "5"}}}}]
Run Code Online (Sandbox Code Playgroud)
目前我遇到以下问题:
[{:put-request
{:item {:seriesId "series 0", :episodeCount 1, :episodeIds #{"0"}}}}
{:put-request
{:item {:seriesId "series 1", :episodeCount 1, :episodeIds #{"1"}}}}
{:put-request
{:item {:seriesId "series 1", :episodeCount 1, :episodeIds #{"2"}}}}
{:put-request
{:item {:seriesId "series 2", :episodeCount 1, :episodeIds #{"3"}}}}
{:put-request
{:item {:seriesId "series 2", :episodeCount 1, :episodeIds #{"4"}}}}
{:put-request
{:item {:seriesId "series 2", :episodeCount 1, :episodeIds #{"5"}}}}]
Run Code Online (Sandbox Code Playgroud)
我正在使用该create-or-update-series功能.我不知道如何找到/获取以前添加的系列(如果添加!)使用seriesId.我尝试了很多东西,但这些都是无穷无尽的曲目.
(ns clojure-sscce.core
(:gen-class)
(:require clojure.pprint))
(defn create-or-update-series
([episodes]
(create-or-update-series episodes []))
([episodes result]
(if (zero? (count episodes))
result
(create-or-update-series (rest episodes)
(conj result {
:put-request {
:item {
:seriesId (:seriesId (first episodes))
:episodeCount 1
:episodeIds #{(:episodeId (first episodes))}}}})))))
;; Tests
(defn -main [& args]
(let
[series0 (mapv (fn [episode-id] {
:seriesId "series 0"
:episodeId (str episode-id)}) (range 0 1))
series1 (mapv (fn [episode-id] {
:seriesId "series 1"
:episodeId (str episode-id)}) (range 1 3))
series2 (mapv (fn [episode-id] {
:seriesId "series 2"
:episodeId (str episode-id)}) (range 3 6))]
(clojure.pprint/pprint
(concat series0 series1 series2))
(clojure.pprint/pprint
(create-or-update-series (concat series0 series1 series2)))))
Run Code Online (Sandbox Code Playgroud)
请注意,这{:put-request {:item { ...是必需的,因为新映射应该是PUT到DynamoDB.
会爱你的帮助!
group-by这样的事情非常好.这是与for理解相结合的一次尝试:
(defn group-by-series [episodes]
(let [grouped (group-by :seriesId episodes)]
(for [[series eps-in-series] grouped]
{:seriesId series
:episodeCount (count eps-in-series)
:episodeIds (into #{} (map :episodeId eps-in-series))})))
(group-by-series example-data)
;=> ({:seriesId "series 0", :episodeCount 1, :episodeIds #{"0"}}
; {:seriesId "series 1", :episodeCount 2, :episodeIds #{"1" "2"}}
; {:seriesId "series 2", :episodeCount 3, :episodeIds #{"3" "4" "5"}})
Run Code Online (Sandbox Code Playgroud)
for如果需要,您可以在理解中添加DynamoDB内容,或者创建包装函数并将其映射到它们之间.