标签: mongodb-java

java中mongo数据库中所有集合的列表

如何获取数据库中所有集合的列表?

  • 数据库 - mongodb;
  • language - java;
  • ide - eclipse;

java mongodb mongodb-java

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

Spring-Data mongodb查询存储在同一集合中的多个类

使用Spring-Data,您可以使用@Document批注指定要将对象保存到的集合.假设我有两个班,学生和老师,都坚持进入人物收藏.当我执行以下代码时:

mongo.find(new Query(), Teacher.class);
Run Code Online (Sandbox Code Playgroud)

结果包含学生和教师.查看Spring-Data创建的数据,每个文档都包含一个"_class"字段,用于指示从哪个类持久化.

这个字段在查找过程中没有用作仅返回教师的过滤器?除了这样做之外,我如何仅查询教师:

mongo.find(new Query().addCriteria(where("_class").is(Teacher.class.getCanonicalName()), Teacher.class);
Run Code Online (Sandbox Code Playgroud)

mongodb mongodb-java spring-data mongodb-query

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

PersistenceConstructor参数变量名称与实例变量名称不匹配

我试图用spring-data-mongodb版本持久保存以下对象1.1.1.RELEASE:

@Document
public static class TestObject {

    private final int m_property;

    @PersistenceConstructor
    public TestObject(int a_property) {
        m_property = a_property;
    }

    public int property() {
        return m_property;
    }

}
Run Code Online (Sandbox Code Playgroud)

MappingException当我尝试从数据库中读取对象时,我得到了一个(参见下面的完整堆栈跟踪)

我的组使用的命名约定要求参数变量名称a_以及前面的实例变量名称开头m_.似乎spring-data-mongodb假设构造函数参数变量名必须与对象实例变量名匹配.

  • 为什么不spring-data-mongodb将构造函数参数用于我在构造函数中定义的实例变量映射?
  • 是否有另一种方法来定义此映射,以便spring-data-mongodb正确构造我的对象,或者是我打破命名约定的唯一选择?

.

Exception in thread "main" org.springframework.data.mapping.model.MappingException: No property a_property found on entity class com.recorder.TestRecorder$TestObject to bind constructor parameter to!
    at org.springframework.data.mapping.model.PersistentEntityParameterValueProvider.getParameterValue(PersistentEntityParameterValueProvider.java:90)
    at org.springframework.data.convert.ReflectionEntityInstantiator.createInstance(ReflectionEntityInstantiator.java:70)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:229)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:209)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:173)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:169)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:72) …
Run Code Online (Sandbox Code Playgroud)

java naming-conventions mongodb-java spring-data spring-data-mongodb

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

没有索引的MongoDB搜索真的很慢吗?

我正在尝试MongoDB的性能来比较我当前基于MySQL的解决方案。

在具有三个属性A,B和C的集合/表X中,我在MongoDB和MySQL中都为属性A编制了索引。

现在,我在MongoDB和MySQL中投入了1M数据,并在这种简单的情况下尝试了搜索性能。

MongoDB上的插入速度仅比插入MySQL快10%。但这没关系,我知道采用MongoDB不会带来我的CRUD的神奇提升,但是我真的对在没有索引的MongoDB中进行搜索感到惊讶。

结果表明,MongoDB在非索引字段上的选择比在索引字段上的选择慢十倍。

另一方面,非索引字段上的MySQL选择(MyISAM)仅比索引字段上的选择慢70%。

最后但并非最不重要的一点是,在选择索引方案中,MongoDB比我的MySQL解决方案快30%。

我想知道,上述数字正常吗?特别是MongoDB的性能选择没有索引?

我的代码如下:

BasicDBObject query = new BasicDBObject("A", value_of_field_A);
DBCursor cursor = currentCollection.find(query);
while(cursor.hasNext()) {
    DBObject obj = cursor.next();
    // do nothing after that, only for testing purpose
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,从业务逻辑的角度来看,我的收藏可能真的很大(TB甚至更多),您对每个物理收藏的大小有何建议?1000万个文档还是10亿个文档?

非常感谢!

------------------------------编辑------------------- -----------

我在MongoDB和MySQL上都尝试了1000万条记录的插入,而MongoDB的行为比MySQL快20%-确实不如我想的那样。

我很好奇,如果我设置了MongoDB自动分片,是否会提高插入速度?如果是这样,我是否需要将碎片放在不同的物理机器上,或者可以将它们放在具有多核的同一台机器上?

------------------------------更新------------------- -----------

首先,我将MongoDB的写关注从ACKNOWLEDGED修改为UNACKNOWLEDGED,然后MongoDB的插入速度提高了3倍。

后来,我并行制作了插入程序(使用8核计算机的8线程),对于MongoDB ACKNOWLEDGED模式,插入也进行了3倍的改进,对于UNACKNOWLEDGED模式,速度实际上降低了50%。

对于MySQL,并行插入模式将速度提高了5倍!这比MongoDB最好的插入盒快!

mongodb mongodb-java mongodb-query

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

如何在Spring-Data-MongoDB框架中将BigDecimal转换为Double

Spring Data MongoDB映射默认将BigDecimal转换为String。但是,我希望它们在mongodb中转换为Double。后者对于在mongodb中的此字段上进行查询(比较查询/聚合查询)是必需的。如何注册自己的转换器(BigDecimalToDouble / DoubleToBigDecimal)以执行此操作?

java spring mongodb mongodb-java spring-data-mongodb

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

findAndModify失败并显示错误:"无法同时更新'field1'和'field1'

我正在尝试构建MongoDB Java findAndModify查询.

主要目的是我想在自己的插入查询中设置_id.

这是我的代码:

BasicDBObject findFilter = new BasicDBObject("type", "group")
//
BasicDBObject dialogInsertObject = new BasicDBObject("name", "my group").append("_id", new ObjectId());
//
BasicDBObject dialogUpdateObject = new BasicDBObject("name", "my group");
//
BasicDBObject upsertMap = new BasicDBObject();
upsertMap.append("$setOnInsert", dialogInsertObject);
upsertMap.append("$set", dialogUpdateObject);


DBObject dialogObject = dialogCollection.findAndModify(findFilter, 
   new BasicDBObject("_id", "1"), null, false, upsertMap, true, true);
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

com.mongodb.CommandFailureException: { "serverUsed" : "localhost:27017" , 
  "errmsg" : "exception: Cannot update 'name' and 'name' at the same time" , 
  "code" : 16836 , "ok" : 0.0} …
Run Code Online (Sandbox Code Playgroud)

java mongodb mongodb-java mongodb-query

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

关闭MongoDB Java连接

我正在尝试设计一个Mongo Db连接类,我将MongoClient设置为静态.

private static MongoClient client = null;

public static DB connectToMongo() throws Exception {
    if (null != client) {
        return client.getDB(DBNAME);
    }       
    client = new MongoClient(HOST,PORT);                
    return client.getDB(DBNAME);    
}
Run Code Online (Sandbox Code Playgroud)

我的整个Web应用程序使用上面的方法连接到Mongo,如下所示:

db = MongoDBConnection.connectToMongo();
collection = db.getCollection("collectionName");
Run Code Online (Sandbox Code Playgroud)

执行数据库操作后,我从不为MongoClient调用close连接.连接类总是会返回相同的MongoClient实例,它永远不会关闭.我关闭的唯一内容就是游标.

  • 是否有必要在每次查询数据库时关闭MongoClient?我的上述设计有效吗?

java mongodb mongodb-java mongodb-query

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

MongoDB:ReadPreferenceServerSelector未选择任何服务器

最近我使用的是新发布的mongodb java异步驱动程序.我正在写一些简单的测试代码,它们是:

    MongoClient mongoClient = MongoClients.create();
    System.out.println("database has been connected!");

    SingleResultCallback<Void> callbackWhenFinished = new SingleResultCallback<Void>() {
        @Override
        public void onResult(final Void result, final Throwable t) {
            System.out.println("Operation Finished!");
        }
    };

    mongoClient.listDatabaseNames().forEach(new Block<String>() {
        @Override
        public void apply(final String s) {
            System.out.println(s);
        }
    }, callbackWhenFinished);
Run Code Online (Sandbox Code Playgroud)

但是,没有调用回调函数,控制台输出是:

2015年4月18日下午10:50:27 com.mongodb.diagnostics.logging.JULLogger日志消息:使用设置创建的集群{hosts = [localhost:27017],mode = SINGLE,requiredClusterType = UNKNOWN,serverSelectionTimeout ='30000 ms', maxWaitQueueSize = 500}
数据库已连接! 2015年4月18日下午10:50:28 com.mongodb.diagnostics.logging.JULLogger日志消息:ReadPreferenceServerSelector {readPreference = primary}从集群描述ClusterDescription中选择的服务器 {type = UNKNOWN,connectionMode = SINGLE,all = [ServerDescription { address = localhost:27017,type = UNKNOWN,state = …

mongodb mongodb-java

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

MongoDB Java驱动程序:MongoCore驱动程序与MongoDB驱动程序与MongoDB异步驱动程序

MongoDB Java驱动程序有三种不同的驱动程序选项:

  1. 核心司机
  2. MongoDB驱动程序
  3. MongoDB异步驱动程序

司机介绍页面给他们每个人的简要介绍,但没有进一步的解释,提供关于何时应该使用它们.我的问题:请你澄清一下使用它们的案例是什么?什么时候我应该更喜欢一个,当我必须/必须使用特定的驱动程序选项?

java mongodb mongodb-java mongodb-query

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

MongoDB Spark Connector-聚合速度很慢

我在Spark应用程序和Mongos控制台上运行相同的聚合管道。在控制台上,眨眼间即可获取数据,只需第二次使用“ it”即可检索所有预期数据。但是,根据Spark WebUI,Spark应用程序将花费近两分钟的时间。

在此处输入图片说明

如您所见,正在启动242个任务来获取结果。我不确定为什么在MongoDB聚合仅返回40个文档的同时启动如此大量的任务。看起来开销很高。

我在Mongos控制台上运行的查询:

db.data.aggregate([
   {
      $match:{
         signals:{
            $elemMatch:{
               signal:"SomeSignal",
               value:{
                  $gt:0,
                  $lte:100
               }
            }
         }
      }
   },
   {
      $group:{
         _id:"$root_document",
         firstTimestamp:{
            $min:"$ts"
         },
         lastTimestamp:{
            $max:"$ts"
         },
         count:{
            $sum:1
         }
      }
   }
])
Run Code Online (Sandbox Code Playgroud)

Spark应用程序代码

    JavaMongoRDD<Document> rdd = MongoSpark.load(sc);

    JavaMongoRDD<Document> aggregatedRdd = rdd.withPipeline(Arrays.asList(
            Document.parse(
                    "{ $match: { signals: { $elemMatch: { signal: \"SomeSignal\", value: { $gt: 0, $lte: 100 } } } } }"),
            Document.parse(
                    "{ $group : { _id : \"$root_document\", firstTimestamp: { $min: \"$ts\"}, lastTimestamp: { $max: \"$ts\"} …
Run Code Online (Sandbox Code Playgroud)

mongodb mongodb-java mongodb-query apache-spark

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