Java mongodb复杂多条件查询

引入依赖
<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
添加配置
spring:
  data:
    mongodb:
      uri: mongodb://admin:admin@192.168.1.101:27017,192.168.1.102:27017/transfer
使用MongoTemplate
@Resource
private MongoTemplate mongoTemplate;

// 创建查询对象
Query query =new Query();

// 设置分页
query.skip(0); //页码
query.limit(10); //每页显示数量

// 创建复合查询对象
Criteria cri = new Criteria();
// 设置条件(注意:设置查询的值类型必须和mongodb中类型一致)
cri.and("status").is("0");   // 类型为String,类似sql中 status = '0'
cri.and("boolRelation").is(0D);   // 类型为Double,类似sql中 boolRelation = 0
cri.and("enforType").regex("01.*");   // 正则表达匹配,类似右模糊查询,sql中 like '01%'
// 时间段查询
try {
	SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	cri.and("receiveTime").gte(sdf.parse(“2019-07-01 10:00:00”)).lte(sdf.parse(“2019-07-16 10:00:00”));   
}catch (Exception e){
	e.printStackTrace();
}
// 如果查询条件一个字段要匹配多个值,类似 and (path like '1001%' or path = '1002' or path like '%1003%')
List<Criteria> orgCriList = new ArrayList<>();   // 创建条件集合
// 添加条件
orgCriList.add(Criteria.where("path").regex("1001.*"));
orgCriList.add(Criteria.where("path").is("1002"));
orgCriList.add(Criteria.where("path").regex(".*1003.*"));
Criteria orgCri = new Criteria();
orgCri.orOperator(orgCriList.toArray(new Criteria[orgCriList.size()]));
// 创建一个查询对象,用于存放and和or条件
Criteria criteria = new Criteria();
criteria.andOperator(cri,orgCri);
// 添加到query中
query.addCriteria(criteria);
//设置排序
List<Order> orders = new ArrayList<>();
orders.add(new Order(Direction.ASC, "boolRelation"));
orders.add(new Order(Direction.DESC, "receiveTime"));
// 添加到query中
query.with(Sort.by(orders));
/**
 * 最终的查询条件我用oracle sql表示:
 * status = '0'
 * and boolRelation = 0
 * and enforType like '01%'
 * and receiveTime>=to_date('2019-07-01 10:00:00','yyyy-mm-dd hh24:mi:ss')
 * and receiveTime>=to_date('2019-07-01 10:00:00','yyyy-mm-dd hh24:mi:ss')
 * and (path like '1001%' or path = '1002' or path like '%1003%')
 * order by boolRelation, receiveTime desc
 */

// 统计总数
long count = mongoTemplate.count(query, EnforModel.class);
// 查询返回记录
List<AlarmModel> records = mongoTemplate.find(query, EnforModel.class);
例子中用到的实体类
package com.js.enfor.manage.model;

import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

import java.io.Serializable;
import java.util.Date;

/**
 * <p></p>
 * @author ycq
 * @since 2019-07-16
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@Document(collection = "JS_ENFOR_DATA")
public class EnforModel implements Serializable {

    private static final long serialVersionUID = 1L;
    
    /**
     * 主键
     */
    @Id
	private String id;

	/**
	 * 类型
	 */
	private String enforType;
	
	/**
	 * 接收时间
	 */
	private Date receiveTime;

	/**
	 * 是否已关联
	 */
	private Double boolRelation;
	
	/**
	 * 状态
	 */
	private String status;
	
	/**
	 * 关联时间
	 */
	private Date relationTime;
	
	/**
	 * path
	 */
	private String path;
	
}
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MongoDB 聚合框架提供了一种数据处理方式,它能够对集合中的文档进行分组、筛选、投影、排序、限制以及多表关联等操作,从而生成新的文档集合。下面是几种 MongoDB 聚合查询方式的详解: 1. $match 查询 $match 查询通过筛选文档中的字段来过滤数据,类似于 SQL 中的 WHERE 子句。可以使用各种比较运算符、逻辑运算符和正则表达式等条件来实现高级查询。例如,以下代码将返回所有 age 大于等于 18 的文档: ``` db.collection.aggregate([ { $match : { age : { $gte : 18 } } } ]) ``` 2. $group 查询 $group 查询通过将文档分组来聚合数据。可以使用 $sum、$avg、$min、$max 等聚合运算符来计算每个分组的结果。例如,以下代码将返回每个国家的总人口数: ``` db.collection.aggregate([ { $group : { _id : "$country", population: { $sum : "$population" } } } ]) ``` 3. $project 查询 $project 查询用于投影文档中的字段,类似于 SQL 中的 SELECT 子句。可以使用 $addFields、$subtract、$multiply、$divide 等运算符来进行计算或添加新的字段。例如,以下代码将返回包含 name 和 age 字段的文档: ``` db.collection.aggregate([ { $project : { name : 1, age : 1 } } ]) ``` 4. $sort 查询 $sort 查询用于对文档进行排序,类似于 SQL 中的 ORDER BY 子句。可以使用 1 或 -1 来指定升序或降序排列。例如,以下代码将按 age 字段降序排列文档: ``` db.collection.aggregate([ { $sort : { age : -1 } } ]) ``` 以上是 MongoDB 聚合查询的几种方式,它们可以组合使用来实现更复杂的查询。在 Java 中,可以使用 MongoDBJava 驱动程序来进行聚合查询。具体的实现方式可以参考 MongoDB 的官方文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值