先上两段代码
代码一
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()
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("id").in(idList));queryAfter.addCriteria(Criteria.where("time").gte(startTime).lte(endTime));List&lt;TestEntity&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 来获取结果。