3

Mongerを使用して MongoDB にデータを保存しています。Clojure セットを保存したいと思います。セットの読み取りと書き込みは機能しますが、リストとして返されます。MongoDB は set データ型を実際にはサポートしていないので、Monger クライアントもサポートしていないのではないかと思いますが、間違っていることを願っています。

Monger に正しい型で保存したセットを返させる方法はありますか?

最小限の Leiningen の例を以下に示します (これは、最も基本的な Monger の例です)。

> lein new mongo-test
> cd mongo-test

project.clj を編集して Monger の依存関係を追加します。

(defproject mongo-test "0.1.0-SNAPSHOT"
  :dependencies [[org.clojure/clojure "1.5.1"]
                 [com.novemberain/monger "2.0.0-rc1"]])

REPL を開始します。

> lein repl

セットを挿入して読み戻す - 見つかった値はセットではなくリストであることに注意してください。

user=> (require '[monger.core :as mg])
nil
user=> (require '[monger.collection :as mc])
nil
user=> (def conn (mg/connect))
#'user/conn
user=> (def db (mg/get-db conn "monger-test"))
#'user/db
user=> (mc/remove db "things")
#<WriteResult { "serverUsed" : "127.0.0.1:27017" , "n" : 1 , "connectionId" : 248 , "err" :  null  , "ok" : 1.0}>
user=> (mc/insert db "things" {:set #{"A" 1}})
#<WriteResult { "serverUsed" : "127.0.0.1:27017" , "n" : 0 , "connectionId" : 248 , "err" :  null  , "ok" : 1.0}>
user=> (.next (mc/find db "things"))
{"_id" #<ObjectId 537ce43130045df5b9ff1102>, "set" [1 "A"]}
user=> (get (.next (mc/find db "things")) "set")
[1 "A"]
user=> (type (get (.next (mc/find db "things")) "set"))
com.mongodb.BasicDBList
user=> (set (get (.next (mc/find db "things")) "set"))
#{1 "A"}
user=> (type (set (get (.next (mc/find db "things")) "set")))
clojure.lang.PersistentHashSet

明らかに、最後の 2 行のように結果を set に渡すことができますが、特定のキーごとにそれを呼び出す必要はありません。これを透過的に行う方法はありますか?

4

1 に答える 1