如何在 Clojure 中使用数组 JOIN Seq?

How JOIN Seq with Array in Clojure?

我会尝试对 MongoDB 的结果执行 SQL JOIN。 我有数据要显示在网格上:

seqgroup: ({:_id #<ObjectId 54db3ba76a5b2d5de2e7e990>, :group_name gr1, :usersingroup_id [#<ObjectId 54d1e37a2039b30a00b342ca> #<ObjectId 54d8ab240e81f5d1cbf6f691>]}
           {:_id #<ObjectId 54db46ba6a5b2d5de2e7e992>, :group_name gr2, :usersingroup_id [#<ObjectId 54d8af860e81f5d1cbf71da3> #<ObjectId 54d8ab240e81f5d1cbf6f691>]})

我想用 returns 数组显示我保存在不同集合中的用户名,而不是 ObjectId :usersingroup_id :

get-one-user-byid:  {:_id #<ObjectId 54d1e37a2039b30a00b342ca>, :id someuser1}
get-one-user-byid:  {:_id #<ObjectId 54d8ab240e81f5d1cbf6f691>, :id someuser2}

我会怎样 walk/get/conj/??或其他任何包含用户名而不是 ObjectId 的序列?

seqresultgroup: ({:_id #<ObjectId 54db3ba76a5b2d5de2e7e990>, :group_name gr1, :usersingroup_id [someuser1 someuser2]}
           {:_id #<ObjectId 54db46ba6a5b2d5de2e7e992>, :group_name gr2, :usersingroup_id [someuser3 someuser2]}) 

如果我对你的问题的理解正确,你可以尝试这样的事情。我们在组序列上映射一个匿名函数,将用户 ID 向量更新为用户名向量。 userids->usernames 函数映射一个匿名函数,该函数从 id 向量上的 get-one-user-byid 函数的结果中提取 :id。这导致每个组映射的 :usersingroupid 向量被设置为用户 ID 的向量。

(defn userids->usernames [id-coll]
      (map #(:id (get-one-user-byid %)) id-coll))

(map #(assoc % :usersingroup_id (userids->usernames (:usersingroupid %))) seqgroup)
  1. #(assoc % :usersingroup_id ...)

    • 上面的匿名函数是 "mapped" 您调用 seqgroup 的 "group" 个映射列表。此函数将获取每个组映射 %,将键 :usersingroup_id 的值更改为使用键 :usersingroup_id 的值调用 userids->usernames 的结果给定组映射作为参数。
  2. userids->usernames

    • 此函数采用组 ID 向量,并在其上映射一个匿名函数。匿名函数使用您的 get-one-user-byid 函数将用户 %:_id 转换为用户映射。我们通过简单地将 (get-one-user-byid %) 包装在 (:id ...)
    • 中,从用户映射中提取 :id