Tag: mongodb

Mongo连接泄漏与morphia

我有一个static Mongo = new Mongo()和Morphia morphia = new Morphia()对象的Servlet 。 每次调用GET ,我都会执行以下操作: doGet(…){ … datastore = morphia.createDatastore(mongo, dbName); … } 我没有关闭datastore ,因为没有关闭方法。 每次调用servlet时,mongo中使用的连接数都会增长: { “current” : 113, “available” : 706, “totalCreated” : NumberLong(122) } > db.serverStatus().connections { “current” : 115, “available” : 704, “totalCreated” : NumberLong(124) } > db.serverStatus().connections { “current” : 116, “available” : […]

MongoDB:不能使用游标迭代所有数据

更新更新: 解决了 ! 看到这个: MongoDB:无法用游标迭代所有数据(因为数据已损坏) 它是由损坏的数据集引起的。 不是MongoDB或驱动程序。 ================================================== ======================= 我正在使用MongoDB(2.4.6)的最新Java驱动程序(2.11.3)。 我有一个包含约250M记录的集合,我想使用游标迭代所有这些记录。 但是,在10分钟左右之后,我得到了一个假的cursor.hasNext(),或者说服务器上没有光标的exception。 之后我了解了游标超时并用try / catch包装了我的cursor.next()。 如果在迭代所有记录之前有任何exception或hasNext()返回false,程序将关闭游标并分配一个新游标,然后再跳回上下文。 但后来我读到了关于cursor.skip()性能问题……而程序刚刚达到~20M记录,而cursor.skip()之后的cursor.next()抛出了“java.util.NoSuchElementException”。 我相信这是因为跳过操作已经超时,这使光标无效。 是的,我已经阅读过关于skip()性能问题和游标超时问题……但是现在我认为我处于两难境地,修复一个会打破另一个。 那么,有没有办法优雅地遍历庞大数据集中的所有数据? @mnemosyn已经指出我必须依赖基于范围的查询。 但问题在于我想将所有数据分成16个部分并在不同的机器上处理它们,并且数据不是均匀分布在任何单调密钥空间内。 如果需要负载平衡,必须有一种方法来计算特定范围内的密钥数量并平衡它们。 我的目标是将它们分成16个部分,所以我必须找到四分位数的四分位数(对不起,我不知道是否有一个数学术语),并使用它们来分割数据。 有没有办法实现这个目标? 当通过获得分区边界键实现第一次搜索时,我确实有一些想法。 如果新光标再次超时,我可以简单地记录最新的tweetID并重新开始使用新范围。 但是,范围查询应该足够快,否则我仍然会超时。 我对此并不自信…… 更新: 问题解决了! 我没有意识到我不必以粗糙的方式对数据进行分区。 循环工作调度员会这样做。 请参阅接受的答案中的评论。

MongoDB全文搜索索引:错误:文本索引太多,为什么?

我有一个问题,我有收集,我想将文本搜索索引设置为2个字段(描述和标题)。 但当我添加第二个索引时,我得到以下错误,文本搜索停止工作。 { “serverUsed” : “localhost/127.0.0.1:27017” , “ok” : 0.0 , “errmsg” : “too many text index for: testdb.users”} 当我删除一个索引搜索再次开始工作。 问题是什么? 一个集合仅支持一个字段的全文搜索索引???? 我在windows下使用当前版本的mongodb,我正在使用mongodb java驱动程序API。 谢谢

如何在spring-data-mongodb框架中将BigDecimal转换为Double

Spring Data MongoDB映射默认情况下将BigDecimal转换为String。 但是,我希望它们在mongodb中转换为Double。 这是后者在mongodb(比较查询/聚合查询)中对此字段进行查询所必需的。 我如何重新编译自己的转换器(BigDecimalToDouble / DoubleToBigDecimal)来执行此操作?

无法从java连接到本地monogoDB

环境:mac os x 10.10 MongoDB版本:3.0.5 JDK版本:1.8 MongoDB驱动程序:“mongo-java-driver-3.0.2.jar”和“mongodb-driver-async-3.0.2.jar” 问题: 我想连接mongoDB并异步插入一些简单的数据,所以我使用了“ mongodb-driver-async-3.0.2.jar ”。 但我发现我没有连接数据库。代码如下: public static void main(String[] args) { // connect to the local database server,default:127.0.0.1:27017 MongoClient mongoClient = MongoClients.create(); // get handle to “testDB” database MongoDatabase database = (MongoDatabase) mongoClient.getDatabase(“testDB”); SingleResultCallback callbackWhenFinished = new SingleResultCallback() { @Override public void onResult(final Void result, final Throwable t) […]

MongoDB / Morphia将技术ID保存为ObjectId,尽管它是Java中的String

我的MongoDB中有两种文档:客户端和代码。 每个代码都指一个客户端。 客户端必须由管理员显式存储,因此我必须将它们分开存储,并且不能将它们放入代码文档中。 code -> client 现在MongoDB / Morphia将客户端的技术ID保存为ObjectId,而代码引用技术ID为String类型的客户端。 我能够通过给定的客户端ID搜索代码,但在运行时我会收到一条错误消息,因为Morphia无法注入客户端。 我认为这是因为不同的id类型。 code { client.$id: String } client { _id: ObjectId } 任何想法如何解决这一问题? 例外 com.google.code.morphia.mapping.MappingException:无法为org.example.Code.client获取引用({“$ ref”:“clients”,“$ id”:“123456789abcdef”}) 在互联网上我发现了exception消息。 有人建议在模型中使用ObjectId而不是String,但我需要使用String。 这不是我自己的项目。 实体: @Entity(“codes”) public class Code implements Comparable { @Id private String id; @Reference private Client client; […] } @Entity(“clients”) public class Client { @Id private String […]

反序列化MongoDB BSON

我试图从REST服务中获取响应,该服务查询MongoDB的实例并将响应解析为Java对象。 Web服务返回MIME类型为html的响应,并使用换行符分隔返回的每个记录(尽管我可以调整服务返回的内容)。 将BSON响应转换为Java对象的最简单/最有效的方法是什么? 我已经用Java创建了一个模板类来存储数据。 提前致谢! 编辑:一位同事建议我在webservice本身使用MongoDB Java驱动程序的BSON解析实用程序,然后返回一个格式良好的HTML字符串。 这仍然让我在我的应用程序中进行解析,但暂时将作为一种解决方法。 仍在寻找一种方法来轻松反序列化对Java对象的BSON响应。

具有自定义集合名称的Spring Data MongoDB存储库

我正在使用Spring Data for MongoDB,我需要能够在运行时配置集合。 我的存储库定义为: @Repository public interface EventDataRepository extends MongoRepository { } 我试过这个愚蠢的例子: @Document(collection = “${mongo.event.collection}”) public class EventData implements Serializable { 但是mongo.event.collection没有像使用@Value注释那样解析为名称。 多一点调试和搜索,我尝试了以下内容:@Document(collection =“#{$ {mongo.event.collection}}”) 这产生了一个例外: Caused by: org.springframework.expression.spel.SpelParseException: EL1041E:(pos 1): After parsing a valid expression, there is still more data in the expression: ‘lcurly({)’ at org.springframework.expression.spel.standard.InternalSpelExpressionParser.doParseExpression(InternalSpelExpressionParser.java:129) at org.springframework.expression.spel.standard.SpelExpressionParser.doParseExpression(SpelExpressionParser.java:60) at org.springframework.expression.spel.standard.SpelExpressionParser.doParseExpression(SpelExpressionParser.java:32) at org.springframework.expression.common.TemplateAwareExpressionParser.parseExpressions(TemplateAwareExpressionParser.java:154) […]

使用$或$ in在Java中创建mongodb查询

我正在尝试使用mongodb api编写一个java代码来创建这个mongodb查询: { “$or”: [{“prd” : {“$in” : [“1234”, “0987”]}} , {“rsin” : “3228742”}]} 这是我到目前为止使用的代码: QueryBuilder builder = new QueryBuilder(); if (builder == null) { builder = QueryBuilder.start(); } if (mongoKey.equals(“prd”)){ ArrayList vals = new ArrayList(); for (int i=0; i < prdList; i++){ vals.add(prdList.get(i)); } DBObject obj = new BasicDBObject (mongoKey, new BasicDBObject("$in", vals)); builder.or(obj); […]

将JSON解析为MONGODB文档

我是JAVA和MONGODB并且一直在学习如何尝试和理解这些技术是否符合我对产品的要求。 我目前陷入困境,我无法将JAVA文档(记录)插入到我的MONGODB集合中。 我正在使用新的MONGODB version 3.0 。 代码到目前为止 MongoCollection coll = db.getCollection(“Collection”); String json = “{‘class’:’Class10′, ‘student’:{‘name’:’Alpha’, ‘sex’:’Female’}, {‘name’:’Bravo’, ‘sex’:’Male’}}”; 我找到了将其转换为DBObject类型的代码。 DBObject dbObject = (DBObject)JSON.parse(json); 但我想新版本的MONGODB没有insert方法,而是有insertOne method 。 coll.insertOne()要求输入采用Document格式,不接受DBObject格式。 coll.insertOne((Document) dbObject); 给出错误 com.mongodb.BasicDBObject cannot be cast to org.bson.Document 有人可以帮我正确的类型铸造,并给我一个链接,我可以找到并学习相同的? 问候。