相关文章推荐
鼻子大的酱牛肉  ·  asp.net - How to ...·  1 年前    · 
风流倜傥的佛珠  ·  Visual Studio Code ...·  1 年前    · 
买醉的吐司  ·  grpc 断线重连-掘金·  1 年前    · 

先上两段代码
代码一

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);
DBObject query1 = new BasicDBObject(); //setup the query criteria 设置查询条件
query1.put("id", new BasicDBObject("$in", idList));
query1.put("time", (new BasicDBObject("$gte", startTime)).append("$lte", endTime));
DBCursor dbCursor =mongoTemplate.getCollection("testEntity").find(query1);
List<TestEntity> list=new ArrayList<>();
while (dbCursor.hasNext()){
    DBObject object=dbCursor.next();
    TestEntity te=new TestEntity();
    te.setId(object.get("_id").toString());
    te.setTime((Date) object.get("time"));
    list.add(te);

逻辑很简单,从testEntity集合中根据id列表和开始结束时间进行文档筛选,但是在大数据量下,差别太大了!
比如testEntity集合有25万条文档,查询出4万条文档转换成TestEntity实体类集合,第一种直接转换成实体要80秒,而第二种耗时1秒不到!我一度还以为是mongo的问题,后来才定位到是代码的坑!

所以数据量大的时候还是用原生查询手动映射成实体类比较快!

先上两段代码 代码一Query query = new Query();queryAfter.addCriteria(Criteria.where(&quot;id&quot;).in(idList));queryAfter.addCriteria(Criteria.where(&quot;time&quot;).gte(startTime).lte(endTime));List&amp;lt;TestEntity&amp;gt; li...
MongoDB 查询超时异常的原因及解决办法 在对超过百万条记录的集合进行聚合操作时,偶尔会发生Read timed out 异常,本文分析了ConnectionTimeOut和SocketTimeOut的区别,并提出该问题的解决办法。 作者:忙碌的键盘来源:oschina博客|2015-03-09 15:41 【沙龙】51CTO诚邀您9月23号和多位技术大...
mongostat是mongdb自带的状态检测工具,在命令行下使用。它会间隔固定时间获取mongodb的当前运行状态,并输出。如果你发现数据库突然变或者有其他问题的话,你第一手的操作就考虑采用mongostat来查看mongo的状态。它的输出有以下几列:类似于MySQL的slowlog,MongoDB可以监控所有的以及不查询。Profiler默认是关闭的,你可以选择全部开启,或者有查询的时候开启。查看Profile日志3个字段的意义不多说,此处有官方文档。注意,造成满查询可能是索引的问题,也可能是数据不在内存造成因此磁盘读入造成。Mongodb自带了Web控制台,默认和数据服务一同开
在做自己的项目时,因为刚开始接触mongodb非关系型数据库以及关系型数据库的影响还是留在脑中,总会想着进行一个连表查询,然后看官网和资料学习了下,还有那个查询时使用正则来匹配,在这里做个记录 1.mongodb正则匹配 /* 使用$regex字段匹配 */ name: {$regex: 'aa', $options: 'i'}; name: {$regex: /aa/, $options: 'i'}; name: {$regex: /aa/i}; /* 直接使用表达式 */ name: {/aa/i} /* 使用$in来匹配,这个字段必须是一个数组 */ 以下是一个mongo查询的综合应用,即介绍一个生产中实际应用的模糊查询,当然其实也很简单,主要用到mongo中的模糊查询和$or查询,以及并的关系,下面是一个mongo中的一条记录 "_id" : "ffe6a068-9043-4334-97d2-75387340e655", "file_id" : "ffe6a068-9043-4334-97d2-75387340e655", "name" : "中国正大", "update_time" : NumberInt(1554975642), "create_time" : NumberInt(1554975642), 导入(import) 当增量导入mongo时,可以配置--mongo-import-condition参数, 当以cluster提交到yarn上运行时,必须将参数的json内容进行base64加密, 并通过--mongo-import-condition-encrypt指定。 tazk-submit import --connect "mongodb://test:test@127.0.0.1:1370/admin" --database "test_databse" --collection "test_collection" --mongo-camel-convert true --hive-database "de SpringBoot+MongoDB查询大数据字段,查询的单个字段或者总查询结果量太大 用 mongoTemplate.find(query, NewSnapshot.class, collectionName); 查询比较 刚开始是这样查询的 public List<xxx> sss(String a,String b,String c) { Query query = new Query(Criteria.where("a").is(a).and("b").i ```java Criteria criteria1 = Criteria.where("name").is("John"); Criteria criteria2 = Criteria.where("age").gte(18); Query query = new Query(); query.addCriteria(new Criteria().andOperator(criteria1, criteria2)); List<User> users = mongoTemplate.find(query, User.class); 以上代码相当于 `db.getCollection("user").find({name: "John", age: {$gte: 18}})`。 2. 使用 where() 方法联合查询 ```java Query query = Query.query( Criteria.where("name").is("John") .and("age").gte(18) List<User> users = mongoTemplate.find(query, User.class); 以上代码相当于 `db.getCollection("user").find({name: "John", age: {$gte: 18}})`。 3. 使用 @Query 注解联合查询 ```java @Query("{name: ?0, age: {$gte: ?1}}") List<User> findByCriteria(String name, int age); 以上代码相当于 `db.getCollection("user").find({name: "John", age: {$gte: 18}})`,调用方式为 `findByCriteria("John", 18)`。 4. 使用 Aggregation 联合查询 ```java Aggregation aggregation = Aggregation.newAggregation( Aggregation.match(Criteria.where("name").is("John")), Aggregation.project("name", "age") AggregationResults<UserProjection> results = mongoTemplate.aggregate(aggregation, "user", UserProjection.class); List<UserProjection> users = results.getMappedResults(); 以上代码相当于 `db.getCollection("user").aggregate([{$match: {name: "John"}}, {$project: {name: 1, age: 1}}])`。注意,由于聚合操作返回的结果不是实体类的列表,而是一个自定义的投影类(UserProjection),因此需要使用 AggregationResults 来获取结果。