Clojure< - > Monger< - > MongoDB:读写一组

时间:2014-05-21 07:55:12

标签: mongodb clojure monger

我使用Monger在MongoDB中存储数据。我想存放一个Clojure套装。读取和写入集合确实有效,但它作为列表返回。我怀疑MongoDB实际上并不支持设置数据类型,所以Monger客户端也没有,但希望我错了。

有没有办法让Monger以正确的类型返回我存储的集合?

Minimal 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

显然我可以将结果传递给设置,如最后两行所示,但我不想为每个特定键调用它。有没有办法透明地实现这一点?

1 个答案:

答案 0 :(得分:1)

你不幸没错,MongoDB的集合没有build in data type。你的最后一个例子是一个非常有效的处理方法,就像调用

一样
(update-in results [..path.here.. "set"] set) 

在您确实需要使用集合的情况下。