gpt4 book ai didi

mongodb - Clojure <-> Monger <-> MongoDB : reading and writing a set

转载 作者:可可西里 更新时间:2023-11-01 09:52:11 25 4
gpt4 key购买 nike

我正在使用 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

显然我可以将结果传递给 set,就像在最后两行中一样,但我不想为每个特定的键都调用它。有没有办法让这一切透明地发生?

最佳答案

不幸的是你没有错,MongoDB 没有 build in data type对于集合。您的最后一个示例是处理此问题的一种完全有效的方法,就像调用

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

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

关于mongodb - Clojure <-> Monger <-> MongoDB : reading and writing a set,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23777268/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com