精华内容
下载资源
问答
  • 前言:2018年的时候优化了一个项目,该项目从MOngodb中获取数据的时候一次去十万百万千万的数据过,往往每次都要二十秒,三十秒,今天提出了一个代码优化的方案 项目查从mongodb中获取数据:代码A Query query ...

    前言:2018年的时候优化了一个项目,该项目从MOngodb中获取数据的时候一次去十万百万千万的数据过慢,往往每次都要二十秒,三十秒,今天提出了一个代码优化的方案

    项目查从mongodb中获取数据:代码A

    Query query = new Query();
    queryAfter.addCriteria(Criteria.where("id").in(idList));
    queryAfter.addCriteria(Criteria.where("time").gte(startTime).lte(endTime));
    List<TestEntity> lists = mongoTemplate.find(queryBefore,TestEntity.class);
    

     

     

     优化代码示例:代码B

     1 DBObject query1 = new BasicDBObject(); //setup the query criteria 设置查询条件
     2  query1.put("id", new BasicDBObject("$in", idList));
     3  query1.put("time", (new BasicDBObject("$gte", startTime)).append("$lte", endTime));
     4  DBCursor dbCursor =mongoTemplate.getCollection("testEntity").find(query1);
     5  List<TestEntity> list=new ArrayList<>();
     6  while (dbCursor.hasNext()){
     7  DBObject object=dbCursor.next();
     8  TestEntity te=new TestEntity();
     9  te.setId(object.get("_id").toString());
    10  te.setTime((Date) object.get("time"));
    11  list.add(te); 
    12 }

     

    testEntity集合有25万条文档,查询出4万条文档转换成TestEntity实体类集合,代码A直接转换成实体要80秒 ,代码B的查询只要不到一秒钟!


     

     

    扩展:

    理解Java对象DBCursor

    Java对象DBCursor表示MongoDB服务器中的一组文档.使用查找操作查询集合时,通常返回一个DBCursor对象,而不是向Java应用程序返回全部文档对象.

    这样 能够在Java中受控的方式访问文档.

    DBCursor对象以分批的方式从服务器取回文档,并使用一个索引来迭代文档.

    在迭代期间,当索引达到前那批文档末尾时,将从服务器取回下批文档.


    DBCursor实例提供的方法

    方法

    描述 
    BatchSize(size)指定每当读取到当前已下载的最后一个文档时,游标都将再返回多少个文档
    Close()关闭游标并释放它占用的服务器资源
    Copy()返回游标的拷贝
    Count()返回游标表示的文档数
    hasNext()如果游标中还有其他可供迭代的对象,就返回true
    Iterator()为游标创建一个迭代器对象
    Limit(size)指定游标可最多表示多少个文档
    next()为游标中中的下一个文档作为BDObject()返回,并将索引加一
    Size()计算与查询匹配的文档数,且不考虑limit()和skip()的影响
    Skip(size)在返回文档前,跳过指定数量的文档
    Sort(sort)按DBObject参数sort指定的方式对游标中的文档排序
    toArray([max])从服务器检索所有的文档,并以列表的方式返回,如果指定了参数max,则只检索指定数量的文档

     

     

     

     





       


     

     

    转载于:https://www.cnblogs.com/yvanBk/p/10205584.html

    展开全文
  • 项目数据列表上万条后用聚合查询aggregat已经无法达到快速查询的效果,管道操作因为unwind和group也会过滤掉索引,连表查询对索引也会失效,经验不足的我苦思许久都找不到解决办法,贴一段代码如下: private List&...

    项目数据列表上万条后用聚合查询aggregat已经无法达到快速查询的效果,管道操作因为unwind和group也会过滤掉索引,连表查询对索引也会失效,经验不足的我苦思许久都找不到解决办法,贴一段代码如下:

    private List<AggregationOperation> getBaseAggregateOperation() {
            List<AggregationOperation> aggregations = new ArrayList<>();
            aggregations.add(Aggregation.lookup("t_device_info", "s_device_id", "_id", "deviceInfo"));
            aggregations.add(Aggregation.unwind("deviceInfo"));
            aggregations.add(Aggregation.lookup("t_device_type", "deviceInfo.i_type_id", "_id", "deviceType"));
            aggregations.add(Aggregation.unwind("deviceType"));
            aggregations.add(Aggregation.lookup("t_house_hold", "deviceInfo.s_household_id", "_id", "household"));
            aggregations.add(Aggregation.unwind("household"));
            return aggregations;
        }
    

    如图主表连接其他表三次,然后进行unwind,换成数据库脚本操作查询1w数据也要3s,更不要说加上之后分页,条件查询,sort等一系列操作。客户明显无法接受如此速度,翻遍了百度谷歌,也找不到好的解决办法,ps:因为传统分页以及客户需求,必须要统计分页count,于是乎需要一条条的统计。

    最终的缓兵之计是先将多表查询用单表一次次的查询结果,贴一张个人思路图,
    在这里插入图片描述

    • 目前我先将主表数据查询出来然后用主表对应其他表的id去查其他表,4张表以此查询出来,但是对于N:1,无法正确查询出想要的结果,存到一个对象中。我想要达成的为通过单表查询4次数据库,然后得到想要的结果集,最后对结果集进行分页以及一系列操作,因为单表查询可以速度很快,也可以加索引优化
    • 未完待续
      
    展开全文
  • Java中的Mongodb单元测试

    千次阅读 2014-07-16 11:10:01
    我们在java中使用Mongodb作为数据库进行存储的时候,怎么样对于进行测试呢?一种可能直接的方式就是在setUp中getDB,然后在tearDown里面dropDatabase。这样的方式相对来说比较。一种更好的方式就是使用fake的...

    如何进行Mongodb测试?

    我们在java中使用Mongodb作为数据库进行存储的时候,怎么样对于进行测试呢?一种可能直接的方式就是在setUp中getDB,然后在tearDown里面dropDatabase。这样的方式相对来说比较慢。一种更好的方式就是使用fake的数据库,比如embedded的Mongodb用于测试。http://xunitpatterns.com/Test%20Double.html

    我们这里使用的是https://github.com/flapdoodle-oss/de.flapdoodle.embed.mongo


    引入依赖

    build.gradle

    dependencies {
        compile "org.mongodb:mongo-java-driver:2.12.2"


        testCompile "junit:junit:4.11"
        testCompile "de.flapdoodle.embed:de.flapdoodle.embed.mongo:1.46.0"
    }


    脚手架MongodbBaseTest

    编写一个MongoBaseTest,这样所有需要Mongo的测试,可以继承这个类,就可以获取db了。

    public class MongodbBaseTest {
        private static final MongodStarter starter = MongodStarter.getDefaultInstance();
        protected MongoClient mongo;
        protected DB db;
        private MongodExecutable mongodExecutable;
        private MongodProcess mongod;

        @Before
        public void setUp() throws Exception {
            mongodExecutable = starter.prepare(new MongodConfigBuilder()
                    .version(Version.Main.PRODUCTION)
                    .net(new Net(12345, Network.localhostIsIPv6())).build());
            mongod = mongodExecutable.start();


            mongo = new MongoClient("localhost", 12345);
            db = mongo.getDB("embedded-mongo");
        }

        @After
        public void tearDown() throws Exception {
            mongod.stop();
            mongodExecutable.stop();
        }
    }


    编写UserTest

    public class UserTest extends MongodbBaseTest {
        private DBCollection users;

        @Override
        @Before
        public void setUp() throws Exception {
            super.setUp();
            users = db.getCollection("users");
        }

        @Test
        public void should_insert_and_get_user() {
            final DBObject userDocument = new BasicDBObjectBuilder()
                    .add("name", "kiwi")
                    .get();
            users.insert(userDocument);

            final DBObject userDocumentFromDb = users.findOne(new BasicDBObject("_id", userDocument.get("_id")));

            assertThat(userDocumentFromDb.get("name"), is("kiwi"));
        }
    }


    其他:

    https://github.com/fakemongo/fongo

    展开全文
  • java mongodb模糊查询优化

    千次阅读 2018-03-26 10:21:13
    query.addCriteria(Criteria.where("time").regex(Pattern.compile( "^.*" + CommUtil.toString(queryParams....这个是我之前用的模糊查询;利用 Pattern来拼接查询条件。但是后来发现当...
    query.addCriteria(Criteria.where("time").regex(Pattern.compile(
    					"^.*" + CommUtil.toString(queryParams.get("QueryTime")) + ".*$", Pattern.CASE_INSENSITIVE)));

    这个是我之前用的模糊查询;利用 Pattern来拼接查询条件。

    但是后来发现当数据达到一定的量的时候。这样全局去模糊的匹配,查询速率就会特别慢。

    于是我们老大提出修改

    query.addCriteria(Criteria.where("time").gte(CommUtil.toString(queryParams.get("timeQuery")) + " 00:00:00"));
    query.addCriteria(Criteria.where("time").lte(CommUtil.toString(queryParams.get("timeQuery")) + " 23:59:59")); 

    利用gte(大于等于)和了lte(小于等于)去做限制条件就不会去模糊匹配。

    这样效率就会特别快。

    展开全文
  • Mongodb开启慢查询

    2021-01-12 10:21:00
    开启慢查询Profiling Profiling级别说明 0:关闭,不收集任何数据。 1:收集慢查询数据,默认是100毫秒。 2:收集所有数据 1、通过修改配置文件开启Profiling  修改启动mongo.conf,插入以下代码 #开启慢查询,...
  • 然后在查询数据的时候,数据库里面的这个表的documents数3789,也不多啊,怎么会这么呢。可能这单个model的属性比较多,单个doc单size大了点吧。 具体单model代码我就不贴了。后面我给这个model的某个属性,加...
  • 在测试类中调用继承了MongoRepository接口的方法fildAll(),run后连接MongoDB数据库超时 org.springframework.dao.DataAccessResourceFailureException: Timed out after 30000 ms while waiting to connect. Client...
  • Java MongoDB 条件查询及其分组查询

    千次阅读 2014-04-11 19:27:01
    如果你已经搜索到了这个页面,那我很不幸的告诉你,java mongodb查询不仅,而且很繁琐。  先简单地介绍下,我要实现的功能。  本人一直在做网站运维这块,在统计网站数据的过程中,需要计算PV、UV,时间单位...
  • javamongodb查询结果如何只返回指定字段 解决方法: 像mysql那样使用*,就是查询所有字段,效率低,mongodb也一样,默认查所有属性,数据大的话效率特别。 使用projection方法来实现:...
  • MongoDB慢日志查询

    千次阅读 2019-06-13 16:37:50
    MongoDB system.profile 前言 Part1: 写在最前 说到MongoDB日志分析,...我们可以通过对这个集合的查询,来了解当前的日志,进而对数据库进行优化。 Part2: 整体环境 MongoDB 3.2.5 实战 Part1: 输出示范 在查...
  • 默认情况下,当执行完数据库的查询或者更新操作后,连接将自动回到连接池中。不需要我们手动调用代码放回池中。至于如何实现,我猜测是update,query,save方法内部有finally块,那里面有还连接到池中的代码。   ...
  • 使用mongodb 查数据库,那是真的呐。数据量小的时候,没感觉啥,数据量稍微大点。那速度贼感人。 下面是几种查询情况的对比。 1,使用Spring-data-mongodb。 2,使用游标查询 3,还是spring的 先是代码: ...
  • mongodb如何记录慢查询

    千次阅读 2016-06-01 15:43:36
    mongodb如何记录慢查询
  • Java访问MongoDB:安装驱动

    千次阅读 2019-01-06 10:24:22
    Spring项目中可能需要用到MongoDB,要了解一下Java项目如何连接MongoDB,查了查google,对比了一下,发现官网的讲解非常清楚,这样的话,直接阅读官网,效率是最高的。 官网的位置:...
  • 在MySQL中,慢查询日志是经常作为我们优化数据库的依据,那在MongoDB中是否有类似的功能呢?答案是肯定的,那就是MongoDB Database Profiler。下面这篇文章主要给大家介绍了关于MongoDB慢日志查询(profile)的相关...
  • Java实现mongoDB的数据导入TIDB

    千次阅读 2017-08-31 15:57:10
    Java实现mongoDB的数据导入TIDB目录用 [TOC]来生成目录:Java实现mongoDB的数据导入TIDB目录 一mongoDB的优缺点 二TiDB的核心特性 程序实现两个数据库的数据的转移 代码块一、mongoDB的优缺点:优点: - 面向文档...
  • 最近在java项目中写mongodb的案例,碰到了一些棘手的问题, 下面来总结一下(模糊查询,普通查询,时间段查询,还有一些特殊的查询方式)贴一小段拼凑查询条件的代码 private BasicDBObject param; // 汇总查询条件 /*...
  • 1. MongoDB的下载. mongoDB官网:https://www.mongodb.com/ 根据业界规则,偶数为“稳定版”,奇数为“开发版” 32bit的mongodb最大只能存放2G的数据,64bit没有限制 我下载了最新的3.4.4.msi安装稳定版。 2. ...
  • 记一次Mongodb聚合查询 一、慢查询 db.public_setting_detail.aggregate([ { "$project": { "creator": 1, "publicStatus": 1, "publicObject": 1, "isdir": 1, "status": 1, "resourceId": 1, ...
  • Java操作MongoDB——删除 删除代码(支持批量操作) //删除 @Override public Map deleteManyByCollectionName(Map<String, Object> map) { //筛选条件 Map<String,Object> filter = new HashMap&...
  • mongodb连接java 在本文中,我将介绍如何从无状态Java EE应用程序连接到MongoDB,以利用与MongoDB Java驱动程序提供的数据库的内置连接池。 如果您开发的REST API对MongoDB执行操作,则可能是这种情况。 获取Java ...
  • java操作mongodb的例子

    千次阅读 2014-06-17 12:01:01
    package org.senssic.mongodb; import java.util.Date; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import com.mongodb.BasicDBObject; import com.mongod
  • 前言文章内容输出来源:拉勾教育Java高薪训练营;NoSQL=Not Only SQL,支持类似SQL的功能, 与Relational Database相辅相成。其性能较高,不使用SQL意味着没有结构化的存储要求(SQL为结构化的查询语句),没有约束...
  • javaMongoDB的分页实现

    千次阅读 2016-04-25 14:08:36
     * 不要轻易使用Skip来做查询,否则数据量大了就会导致性能急剧下降,这是因为Skip是一条一条的数过来的,多了自然就了  * @param doc  */  public void find(MongoCollection doc){  //分页查询,skip(n...
  • mongodb count()查询

    2021-01-15 17:31:42
    今天发现mongodb分页查询非常,主查询也条件建了索引,最后找到原因是count()计算总行数好使很久,只有14000多条数据,需要大概40秒左右; 后来试着加上projection只返回一个唯一标识的字符串字段,大概9秒,然后...
  • 因为自己工作中会需要用到MongoDB,为了在JAVA上用MongoDB用得更舒服,所以开发了这个工具。 相较于之前的版本,几乎重写所有代码。 要求java7及以上,MongoDB由于3.0后改变较大,最好是3.2或...
  • MongoDBJava与对象关系映射 MongoDBJava与对象关系映射
  • MongoDB的其他查询不一一列举,但将java中的仓库定义的方法名的规则列举如下,使用时将仓库中方法上的注解@Query中的value进行适当泰欧正即可。   GreaterThan(大于)    方法名举例: ...
  • 初识MongoDB+Java调用

    2019-08-13 15:50:20
    MongoDB下载地址:下载MongoDB,由于官网实在太,大家可以转向我这里下载 教程地址:https://www.runoob.com/mongodb/mongodb-tutorial.html(建议边看边实战) 最终集成Java环境需要相关JDK,大家可以转向官网...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,656
精华内容 5,862
关键字:

java查询慢mongodb

java 订阅