标签: monger

防止mongodb死亡'状态应该是:打开'

我在一个多线程的clojure应用程序中使用mongodb,使用monger库,我的一个生产者线程正在死亡

java.lang.IllegalStateException: state should be: open
 at com.mongodb.assertions.Assertions.isTrue (Assertions.java:70)
    com.mongodb.connection.DefaultServer.getConnection (DefaultServer.java:84)
    com.mongodb.binding.ClusterBinding$ClusterBindingConnectionSource.getConnection (ClusterBinding.java:86)
    com.mongodb.operation.QueryBatchCursor.getMore (QueryBatchCursor.java:205)
    com.mongodb.operation.QueryBatchCursor.hasNext (QueryBatchCursor.java:103)
    com.mongodb.MongoBatchCursorAdapter.hasNext (MongoBatchCursorAdapter.java:46)
    com.mongodb.DBCursor.hasNext (DBCursor.java:155)
    clojure.lang.RT$4.invoke (RT.java:512)
    clojure.lang.LazySeq.sval (LazySeq.java:40)
    clojure.lang.LazySeq.seq (LazySeq.java:49)
    clojure.lang.RT.seq (RT.java:525)
    clojure.core$seq__6416.invokeStatic (core.clj:137)
    clojure.core$map$fn__6875.invoke (core.clj:2719)
    clojure.lang.LazySeq.sval (LazySeq.java:40)
    clojure.lang.LazySeq.seq (LazySeq.java:49)
    clojure.lang.RT.seq (RT.java:525)
    clojure.core$seq__6416.invokeStatic (core.clj:137)
    clojure.core$map$fn__6875.invoke (core.clj:2719)
    clojure.lang.LazySeq.sval (LazySeq.java:40)
    clojure.lang.LazySeq.seq (LazySeq.java:49)
    clojure.lang.RT.seq (RT.java:525)
    clojure.core$seq__6416.invokeStatic (core.clj:137)
    clojure.core$filter$fn__6902.invoke (core.clj:2782)
    clojure.lang.LazySeq.sval (LazySeq.java:40)
    clojure.lang.LazySeq.seq (LazySeq.java:49)
    clojure.lang.ChunkedCons.chunkedNext (ChunkedCons.java:59)
    clojure.lang.ChunkedCons.next (ChunkedCons.java:43)
    clojure.lang.RT.next (RT.java:703)
    clojure.core$next__6400.invokeStatic (core.clj:64)
    clojure.core$dorun.invokeStatic (core.clj:3115)
    clojure.core$doall.invokeStatic (core.clj:3121)
    clojure.core$doall.invoke (core.clj:3121)
    myapp.ns1.$somefn.invokeStatic (ns1.clj:93)
    myapp.ns1.$somefn.invoke (ns1.clj:90)
    myapp.ns1$anotherfn.invokeStatic (ns1.clj:124)
    myapp.ns1$anotherfn.invoke (ns1.clj:116)
    myapp.ns2$doit.invokeStatic …
Run Code Online (Sandbox Code Playgroud)

multithreading clojure mongodb mongodb-java monger

7
推荐指数
1
解决办法
991
查看次数

将Mongodb ObjectId自动映射到字符串或从字符串映射

我正在使用Monger库从Clojure访问Mongo数据库.令我烦恼的一件事是在ObjectId实例和字符串之间来回切换.

例如,此代码(mc/find-maps "posts" {})将使用_id条目值设置为ObjectId类的实例来评估映射,而在我的应用程序中,我发现将它作为字符串更有用,我知道它是唯一的.

另一方面,对于这样的表达式:(mc/find-map-by-id "posts" (new ObjectId id))我在其中使用String对象作为id参数,我必须使用它来构造一个实例ObjectId.

有没有办法使_id应用程序中的字符串和mongo端的ObjectId之间的转换值自动且透明地转换?某种选项,在启用时,会创建带有ids字符串表示的地图,反之亦然,在用作查询中的参数时会转换ids t对象ID的字符串表示形式?

如果没有,还有哪些其他策略?

clojure mongodb monger

7
推荐指数
1
解决办法
1040
查看次数

使用Monger返回更新的文档

在Monger中,有一个insert-and-return用于返回新插入文档的函数.

没有update-and-return功能.

如何从执行更新的函数返回更新的文档?

我想我可以使用,save-and-return但在我看来,我不能使用像$push这个功能的运算符.

clojure mongodb monger

5
推荐指数
1
解决办法
850
查看次数

使用Monger的MongoDB连接模式

我是clojure的新手.

是否有通过贩子与mongodb连接的习语/模式?

我是否必须使用连接和断开连接

(monger.core/connect) & (monger.core/disconnect conn)
Run Code Online (Sandbox Code Playgroud)

分别.每一次 ?

有没有办法可以重用连接池中的连接?

clojure mongodb monger

4
推荐指数
1
解决办法
952
查看次数

Clojure - 如何在单元测试中正确挂载状态

我正在尝试使用 Monger 数据库库在 luminus 应用程序中测试一些数据库操作。

理想情况下,我希望以下内容能够发挥作用。我已经删除了一些不相关的代码。

测试文件:

(ns app.test.handler
  (:require [clojure.test :refer :all]
            [app.db.core :as db]))

(testing "create user"
    (db/create-user "test" "test" "test")
    (is (true? true))))
Run Code Online (Sandbox Code Playgroud)

数据库文件

(defstate db*
  :start (-> env :database-url mg/connect-via-uri)
  :stop (-> db* :conn mg/disconnect))

(defstate db
  :start (:db db*))


(defn create-user
  "Creates a new user with a token"
  [username email password]
  (let [user {:username username
              :email email
              :password (hashers/derive password)
              }]
  (mc/insert db "user" user)))
Run Code Online (Sandbox Code Playgroud)

这不起作用,并给我以下错误:

java.lang.ClassCastException: mount.core.DerefableState cannot be cast to com.mongodb.DB
Run Code Online (Sandbox Code Playgroud)

据我所知,这没有正确安装数据库,因此它无法调用数据库操作。我尝试将此安装代码移至测试中,但仍然收到相同的错误。

我确实让它发挥作用: …

testing clojure mongodb monger luminus

3
推荐指数
1
解决办法
1411
查看次数

如何用Monger执行Mongo`forEach`(或运行我自己的JS)?

我正在使用Monger连接到Mongo.我想跑

db.collection.find().forEach(function(x) { db.collection-two.insert(...) })
Run Code Online (Sandbox Code Playgroud)

我无法在Monger文档中看到相关的"for each"条目,也无法通过JavaScript传递到另一个集合中.我该怎么做呢?

编辑这个问题是基于一个误解(forEach位于客户端API而不是服务器API).我会删除它,但我不能删除它.

clojure mongodb monger

0
推荐指数
1
解决办法
328
查看次数