标签: casbah

为什么我最终得到Casbah/Java MongoDB驱动程序的java.lang.IllegalArgumentException?

我看到一个奇怪的问题使用 casbah / java driver.

当驱动程序尝试从mongo创建响应时,我一直遇到以下异常:


  Oct 16, 2012 10:45:07 AM com.mongodb.DBTCPConnector$MyPort error
  SEVERE: MyPort.error called
  java.lang.IllegalArgumentException: response too long: 1634610484
    at com.mongodb.Response.(Response.java:40)
    at com.mongodb.DBPort.go(DBPort.java:110)
    at com.mongodb.DBPort.go(DBPort.java:75)
    at com.mongodb.DBPort.call(DBPort.java:65)
    at com.mongodb.DBTCPConnector.call(DBTCPConnector.java:201)
    at com.mongodb.DBApiLayer$MyCollection.__find(DBApiLayer.java:295)
    at com.mongodb.DBCursor._check(DBCursor.java:354)
    at com.mongodb.DBCursor._hasNext(DBCursor.java:484)
    at com.mongodb.DBCursor.hasNext(DBCursor.java:509)
    at com.mongodb.casbah.MongoCursorBase$class.hasNext(MongoCursor.scala:73)
    at com.mongodb.casbah.MongoCursor.hasNext(MongoCursor.scala:497)
    at scala.collection.Iterator$class.foreach(Iterator.scala:660)
    at com.mongodb.casbah.MongoCursor.foreach(MongoCursor.scala:497)
        ...
Run Code Online (Sandbox Code Playgroud)

这似乎是随机发生的,即使在mongo不应该从查询中返回任何结果的情况下也是如此.报告的大小不一致,通常大于应有或可能的大小.

我猜这可能是某种形式的腐败与回应.我使用Wireshark很难解决这个问题的正面或反面,但我一直发现导致响应抛出此错误的查询的请求/响应链具有来自MongoDB的"TCP Window Full"响应:

在此输入图像描述

我正在使用的版本:


 Casbah: 2.1.5.0
 Mongo Java Driver: 2.5.3
 MongoDB: 2.2

如果有人能就我可能做错的事情或任何有关如何进一步调试此问题的指示提出任何建议,我将不胜感激.

更新:查看发行说明后,Casbah 2.1.5.0,似乎使用的java驱动程序的版本是2.5.3,而不是2.7.3

java mongodb casbah mongodb-java

41
推荐指数
1
解决办法
3237
查看次数

使用限制时,使用MongoDB获取总文档数

我有兴趣优化我正在使用MongoDB的"分页"解决方案.我的问题很直接.我通常会限制使用该limit()功能返回的文档数量.这迫使我发出一个没有该limit()函数的冗余查询,以便我也可以捕获查询中的文档总数,这样我就可以将其传递给客户端,让他们知道他们必须发出额外的请求.检索其余文件.

有没有办法将其压缩为1个查询?获取文档总数但同时仅使用limit()?检索子集?是否有不同的方式来思考这个问题,而不是接近它?

pagination mongodb casbah mongodb-query aggregation-framework

33
推荐指数
8
解决办法
2万
查看次数

为什么我的MongoDB同步$ push更新失败?

我正在对表单进行一些更新

update(
  { "uuid": someUuid, "revision.versionNumber": someVersionNumber},
  { "$set": { "meta.someId": someId }, "$push": { "meta.someMessages": someMessage } }
)
Run Code Online (Sandbox Code Playgroud)

有时我看的时候这就是所谓的相同uuid,versionNumber,及someId与不同的someMessage第一个更新将会成功,但第二个将静默失败.

我看到蒙戈日志下面,所以我知道该更新能够进入数据库,注意第一次更新具有相同的查询作为第三人,但第一个具有nupdated: 1而第三个具有nupdated: 0

Wed Aug 28 14:50:24 [conn18] update some-db.some_collection query: { uuid: "b841f303-a054-4eb9-8885-9d3ebf9906a1", revision.versionNumber: 9 } update: { $set: { meta.someId: "521e6fe4036420f90371a922" }, $push: { meta.someMessages: { event: "instance.complete", timestamp: new Date(1377726624985) } } } nscanned:2507 nmoved:1 nupdated:1 keyUpdates:0 numYields: 19 locks(micros) w:6010 9ms
Wed Aug 28 …
Run Code Online (Sandbox Code Playgroud)

scala mongodb casbah salat playframework-2.1

21
推荐指数
1
解决办法
857
查看次数

mongodbimport失败 - FailedToParse:期待'{':偏移量:0

我尝试通过...导入7.4 MB的JSON文件

mongoimport -d mongoimport -c test --file jsonTest.json

但我看到了这个问题.

Wed Sep 04 13:08:52.378 exception:BSON representation of supplied JSON is too large: code FailedToParse: FailedToParse: Expecting '{': offset:0

这篇Stackoverflow 帖子提出了与1970年1月1日之前发生的日期类似的问题,但鉴于我的FailedToParse: Expecting '{': offset:0错误,这似乎不适用.

arrays json mongodb casbah mongoimport

14
推荐指数
2
解决办法
1万
查看次数

如何将mongodb与casbah的连接汇集在一起​​?

我正在使用带有scala驱动程序的mongodb casbah.如果我不理解错误,它不提供连接池.是否有任何用于casbah的池库,例如dbcp/ c3p0用于jdbc连接?

scala connection-pooling mongodb casbah

11
推荐指数
1
解决办法
2401
查看次数

如何在scala/play中将casbah mongodb列表转换为json

我正在学习scala和mongodb并使用该剧!框架,所以当我理解事物时,我犯了各种各样的错误.目前我有一个scala对象,它返回一个通过casbah从mongodb查询返回的数据库对象列表,如下所示;

object Alerts  {

   def list() : List[DBObject]= {

        val collection = MongoDatabase.collection;
        val query = MongoDBObject.empty
        val order = MongoDBObject("Issue Time:" -> -1)
        val list = collection.find(query).sort(order).toList
        list
   }
Run Code Online (Sandbox Code Playgroud)

...}

在我的代码的其他地方,我希望输出Json中的对象列表 - 所以我有;

  val currentAlerts = Alerts.list()
Run Code Online (Sandbox Code Playgroud)

我想写的是这样的;

  val resultingJson = currentAlerts.toJson 
Run Code Online (Sandbox Code Playgroud)

但是当我这样做时,我可以理解得到以下错误;

  value toJson is not a member of List[com.mongodb.casbah.Imports.DBObject]
Run Code Online (Sandbox Code Playgroud)

我的问题是 - 将com.mongodb.casbah.Imports.DBObject的List转换为Json输出的正确方法是什么?

编辑:

为清楚起见,我真正想做的就是相当于

val listInJson = collection.find(query).sort(order).toJson
Run Code Online (Sandbox Code Playgroud)

就像我写的一样

val listAsString = collection.find(query).sort(order).toString
Run Code Online (Sandbox Code Playgroud)

scala mongodb playframework casbah

11
推荐指数
3
解决办法
5621
查看次数

如何使用Casbah清除/删除/清空MongoDb集合

我开始在Scala通过Casbah使用MongoDb,但无法在Casbah文档/ google上找到删除集合内容的方法.该MongoDd医生说MongoDB的shell命令这样做是

db.things.remove({}); 
Run Code Online (Sandbox Code Playgroud)

但是我们如何通过Casbah实现同样的目标呢?

提前致谢,

奥利维尔

scala mongodb casbah

10
推荐指数
1
解决办法
8083
查看次数

如何在MongoDB Java驱动程序3中插入文档

使用mongodb java驱动程序的第3版(特别是v3.0.1)来复制文档的惯用方法是什么?

我们有一个会话集合,当一个新会话被创建或修改时,我们想要在一个操作中插入它 - 而不是必须查询文档是否存在然后插入或替换.

我们的旧upsertion代码使用了scala驱动程序casbah 2.7.3.它看起来像:

import com.mongodb.casbah.MongoCollection
import com.mongdb.DBObject
val sessionCollection: MongoCollection = ...
val sessionKey: String = ...
val sessionDocument: DBObject = ... // Either create a new one, or find and modify an existing one

sessionCollection.update(
    "_id" -> sessionKey,
    sessionDocument
    upsert = true
)
Run Code Online (Sandbox Code Playgroud)

在我们当前的项目中,我们只是使用普通的java 3.0.1驱动程序,我们正在使用BsonDocument而不是DBObject使它更具典型性.我尝试用以下内容替换上面的内容:

import com.mongodb.client.MongoCollection
val sessionCollection: MongoCollection = ...
val sessionKey: String = ...
val sessionDocument: BsonDocument = // Either create a new one, or find and modify …
Run Code Online (Sandbox Code Playgroud)

java scala mongodb casbah mongodb-java

10
推荐指数
1
解决办法
1万
查看次数

通过Mongo API连接到CosmosDB在空闲后失败

我们有一个Scala服务器,它使用Casbah包装的Java MongoDB驱动程序.最近,我们使用Mongo API将其数据库从实际的MongoDB切换到Azure CosmosDB.这通常工作正常,但是每隔一段时间对Cosmos的调用就会因MongoSocketWriteException(下面的堆栈跟踪)而失败.

我们正在创建客户端

import com.mongodb.casbah.Imports._

val mongoUrl = "mongodb://username:password@host.documents.azure.com:10255/?ssl=true&replicaSet=globaldb"

val client = MongoClient(MongoClientURI(mongoUrl))
val collection: MongoCollection = client("mongoDatabase")("mongoCollection")
Run Code Online (Sandbox Code Playgroud)

我们尝试&replicaSet=globaldb根据建议的解决方法从连接URI中删除这个看似类似的错误(如何解决MongoError:池连接到CosmosDB时被破坏),但它没有解决问题.

堆栈跟踪:

com.mongodb.MongoSocketWriteException: Exception sending message
    at com.mongodb.connection.InternalStreamConnection.translateWriteException(InternalStreamConnection.java:462)
    at com.mongodb.connection.InternalStreamConnection.sendMessage(InternalStreamConnection.java:205)
    at com.mongodb.connection.UsageTrackingInternalConnection.sendMessage(UsageTrackingInternalConnection.java:95)
    at com.mongodb.connection.DefaultConnectionPool$PooledConnection.sendMessage(DefaultConnectionPool.java:424)
    at com.mongodb.connection.CommandProtocol.sendMessage(CommandProtocol.java:209)
    at com.mongodb.connection.CommandProtocol.execute(CommandProtocol.java:111)
    at com.mongodb.connection.DefaultServer$DefaultServerProtocolExecutor.execute(DefaultServer.java:159)
    at com.mongodb.connection.DefaultServerConnection.executeProtocol(DefaultServerConnection.java:286)
    at com.mongodb.connection.DefaultServerConnection.command(DefaultServerConnection.java:173)
    at com.mongodb.operation.CommandOperationHelper.executeWrappedCommandProtocol(CommandOperationHelper.java:215)
    at com.mongodb.operation.CommandOperationHelper.executeWrappedCommandProtocol(CommandOperationHelper.java:206)
    at com.mongodb.operation.CommandOperationHelper.executeWrappedCommandProtocol(CommandOperationHelper.java:112)
    at com.mongodb.operation.CountOperation$1.call(CountOperation.java:210)
    at com.mongodb.operation.CountOperation$1.call(CountOperation.java:206)
    at com.mongodb.operation.OperationHelper.withConnectionSource(OperationHelper.java:230)
    at com.mongodb.operation.OperationHelper.withConnection(OperationHelper.java:203)
    at com.mongodb.operation.CountOperation.execute(CountOperation.java:206)
    at com.mongodb.operation.CountOperation.execute(CountOperation.java:53)
    at com.mongodb.Mongo.execute(Mongo.java:772)
    at com.mongodb.Mongo$2.execute(Mongo.java:759)
    at com.mongodb.DBCollection.getCount(DBCollection.java:962)
    at com.mongodb.DBCursor.count(DBCursor.java:670)
    at com.mongodb.casbah.MongoCollectionBase.getCount(MongoCollection.scala:496)
    at com.mongodb.casbah.MongoCollectionBase.getCount$(MongoCollection.scala:488) …
Run Code Online (Sandbox Code Playgroud)

azure mongodb casbah mongodb-java azure-cosmosdb

9
推荐指数
1
解决办法
2046
查看次数

如何查询数组[String]的正则表达式匹配?

我尝试通过Casbah查询MongoDB的字段是一个带有正则表达式的字符串数组.

例如:

我有一个带有ips列表的Maschine,它们在字段ips中以字符串形式存储.现在我想搜索所有具有子网192.168的计算机.

对我来说,我看起来我无法查询应用于每个条目的regexp的数组,如果其中一个条目匹配,则返回该机器.

有什么方法可以进行这样的查询吗?

- 修正了

谢谢你的帮助.

现在一切都有效.最后我需要解决Casbah的一个限制,因为我需要加入查询$或者Casbah抱怨错误地使用regexp.

我的RegExp Array查询的最终代码包含另外一个字段:

val regexp = ".*" + parameter + ".*"
val nameQ = MongoDBObject("serverName" -> regexp.r)
val ipsQ = MongoDBObject("ips" -> regexp.r)
val bldr = MongoDBList.newBuilder
bldr += ipsQ
bldr += nameQ
val query = MongoDBObject("$or" -> bldr.result.asDBObject)
val result = find(query)
Run Code Online (Sandbox Code Playgroud)

它不是最好的代码,需要修复参数的字符串连接.但它的工作原理:)

scala mongodb casbah salat

8
推荐指数
1
解决办法
2443
查看次数