我看到一个奇怪的问题使用 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
我有兴趣优化我正在使用MongoDB的"分页"解决方案.我的问题很直接.我通常会限制使用该limit()
功能返回的文档数量.这迫使我发出一个没有该limit()
函数的冗余查询,以便我也可以捕获查询中的文档总数,这样我就可以将其传递给客户端,让他们知道他们必须发出额外的请求.检索其余文件.
有没有办法将其压缩为1个查询?获取文档总数但同时仅使用limit()
?检索子集?是否有不同的方式来思考这个问题,而不是接近它?
pagination mongodb casbah mongodb-query aggregation-framework
我正在对表单进行一些更新
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) 我尝试通过...导入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
错误,这似乎不适用.
我正在使用带有scala驱动程序的mongodb casbah
.如果我不理解错误,它不提供连接池.是否有任何用于casbah的池库,例如dbcp
/ c3p0
用于jdbc连接?
我正在学习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通过Casbah使用MongoDb,但无法在Casbah文档/ google上找到删除集合内容的方法.该MongoDd医生说MongoDB的shell命令这样做是
db.things.remove({});
Run Code Online (Sandbox Code Playgroud)
但是我们如何通过Casbah实现同样的目标呢?
提前致谢,
奥利维尔
使用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) 我们有一个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) 我尝试通过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)
它不是最好的代码,需要修复参数的字符串连接.但它的工作原理:)
casbah ×10
mongodb ×10
scala ×6
mongodb-java ×3
java ×2
salat ×2
arrays ×1
azure ×1
json ×1
mongoimport ×1
pagination ×1