springboot整合Mangodb实现crud,高级查询,分页,排序,简单聚合
//linux安装mangodb教程:https://www.cnblogs.com/yangxiaohui227/p/11347832.html
1.引入maven 依赖 <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
2.在application.yml进行连接信息配置
srpring:
data:
mongodb:
uri: mongodb://yangxiaohui:Yangxiaohui227@106.52.85.248:27017/shopdb?maxPoolSize=256 -- 注释:uri的格式:mongodb://username:password@IP:port/database?maxPoolSize=256
3.mysql中的一张表,在mysql数据库中会有一个实体(entiy/pojo/domain)跟其对应,同理mango中的collection(表) 也会有一个实体跟其对应:
//创建一个order表如下:
@Document(collection = "order") //贴有该注解的字符会被映射为对应的集合名字
public class ShopMongoOrder {
@Id //贴有Id注解,生成mongodb的collection对象后,被贴注解的字段就是唯一主键,不能重复
private String orderId;
private String orderTitle;
private BigDecimal orderTotalAmount;
private BigDecimal orderPayAmount;
private String createTime;
private String finishTime;
private String deliveryTime;
@Indexed(unique = false) //索引的创建
private Integer orderStatus;
@Field(value ="paymentStatus" ) //如果没添加这个注解的话,在mongodb中使用的是payStatus字段名称
private Integer payStatus;
private String customerId;
/**
* 日期格式如果不想用String类型表示,可以用下面的格式化方式
* @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTime;//最新浏览时间
*
*
*/
public String getCustomerId() {
return customerId;
}
public void setCustomerId(String customerId) {
this.customerId = customerId;
}
public String getOrderId() {
return orderId;
}
public void setOrderId(String orderId) {
this.orderId = orderId;
}
public String getOrderTitle() {
return orderTitle;
}
public void setOrderTitle(String orderTitle) {
this.orderTitle = orderTitle;
}
public BigDecimal getOrderTotalAmount() {
return orderTotalAmount;
}
public void setOrderTotalAmount(BigDecimal orderTotalAmount) {
this.orderTotalAmount = orderTotalAmount;
}
public BigDecimal getOrderPayAmount() {
return orderPayAmount;
}
public void setOrderPayAmount(BigDecimal orderPayAmount) {
this.orderPayAmount = orderPayAmount;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
public String getFinishTime() {
return finishTime;
}
public void setFinishTime(String finishTime) {
this.finishTime = finishTime;
}
public String getDeliveryTime() {
return deliveryTime;
}
public void setDeliveryTime(String deliveryTime) {
this.deliveryTime = deliveryTime;
}
public Integer getOrderStatus() {
return orderStatus;
}
public void setOrderStatus(Integer orderStatus) {
this.orderStatus = orderStatus;
}
public Integer getPayStatus() {
return payStatus;
}
public void setPayStatus(Integer payStatus) {
this.payStatus = payStatus;
}
}
//单条插入
@Service
public class MangodbService {
@Autowired
private MongoTemplate mongoTemplate;
@Autowired
private ShopOrderMastMapper orderMastMapper;
//新增
public void insertOrder(String orderId){
ShopMongoOrder shopMongoOrder = orderMastMapper.selectMongoOrderByOrderId(orderId);
if(null!=shopMongoOrder){
mongoTemplate.insert(shopMongoOrder); //调用的是insert(T objectToSave)该方法,因为T是实体类,通过注解就知道查到哪个collection了,mango不像mysql一样需要先创建表,它不用,第一条插入的数据,发现没有对应的collection就会创建
}
}
}
//插入第一条数据后:
重复插入后会报错:
//批量新增
//批量插入
public void insertAll(){
List<ShopMongoOrder> shopMongoOrders = orderMastMapper.selectOrderList();
Collection<ShopMongoOrder> mongoOrders = mongoTemplate.insertAll(shopMongoOrders);
return ;
}
//删除单条数据
//删除单条
public void deleteByOrderId(String orderId){
ShopMongoOrder shopMongoOrder = orderMastMapper.selectMongoOrderByOrderId(orderId);
mongoTemplate.remove(shopMongoOrder);
}
//根据条件删除数据
public void deleteByOrderId(String orderId){
Criteria c = Criteria.where("orderId").is(orderId); //相当于mysql的where orderId="ddd"
Query query = new Query(c);
DeleteResult ret = mongoTemplate.remove(query,ShopMongoOrder.class);
}
//单条修改
//更新订单
public void updateByOrderId(String orderId){
//使用updateFirst(Query query, Update update, Class<?> entityClass)该方法,updateFirst和update方法的区别是:updateFirst只更改查询到的第一条,update是更改所有满足条件的
//new Update().set("orderTitle", "iphone").set("a","b") 可以使用链式表达式
UpdateResult updateResult = mongoTemplate.updateFirst(new Query(Criteria.where("orderId").is(orderId)), new Update().set("orderTitle", "iphone"), ShopMongoOrder.class); }
//查找单条数据
//查找
public ShopMongoOrder selectOrderId(String orderId){
//findOne(Query query, Class<T> entityClass)
ShopMongoOrder mongoOrder = mongoTemplate.findOne(new Query(Criteria.where("orderId").is(orderId)), ShopMongoOrder.class);
return mongoOrder;
}
//高级查询: 排序 分页
public List<ShopMongoOrder> getList(){
Query query = new Query();
Criteria criteria =new Criteria(); //下面条件相当于select * from order where orderStatus in(16,32) and payStatus=4 and finishTime<=2019-07-05 00:00:00 and (customerId=139 or customerId=1360)
criteria.and("orderStatus").in(16, 32).andOperator(Criteria.where("payStatus").is(4)).and("finishTime").lte("2019-07-05 00:00:00")
.orOperator(Criteria.where("customerId").is("139"),Criteria.where("customerId").is("1360")); //1360
query.addCriteria(criteria);
System.out.println(JSON.toJSONString(criteria));
long count = mongoTemplate.count(query, ShopMongoOrder.class); //计算总数,用于算法分页数
System.out.println(count); int pageNum=1;
int pageSize=20;
int pageTotal=(int) (count%pageSize==0?count/pageSize:count/pageSize+1); //总页数
System.out.println(pageTotal);
int offset=(pageNum-1)*pageSize;
query.with(Sort.by(Sort.Order.desc("deliveryTime"))); //排序逻辑
query.skip(offset).limit(pageSize); // 分页逻辑
List<ShopMongoOrder> shopMongoOrders = mongoTemplate.find(query, ShopMongoOrder.class);
//List<String> customerId = mongoTemplate.findDistinct(query, "customerId", ShopMongoOrder.class, String.class); //查询用户编号,去重
return shopMongoOrders;
}
//聚合操作
public void aggress(){
//java的bigDeciaml类型在mongodb中会变成字符串,所以对bigDeciaml进行sum操作,永远都是返回0
//match是条件:match在group后面就相当于where 语句,在后面相当于having语句,sort要在group后面才有意义
Aggregation aggregation = Aggregation.newAggregation(
Aggregation.group("orderStatus").count().as("total")
.sum("orderPayAmount").as("payAmount")
.first("orderStatus").as("orderStatus") ).withOptions(Aggregation.newAggregationOptions().allowDiskUse(true).build());
//如果不加first的时候,取不到orderStatus的值,所以加了后,分组的值才会有数据
//Aggregation.newAggregationOptions().allowDiskUse(true)是用来解除mongodb 查询数据默认占用最大内存的(默认100M).不然会抛出异常:
AggregationResults<OrderComputeInfo> order = mongoTemplate.aggregate(aggregation, "order", OrderComputeInfo.class);
List<OrderComputeInfo> mappedResults = order.getMappedResults();
System.out.println(mappedResults);
System.out.println(order); }
springboot整合Mangodb实现crud,高级查询,分页,排序,简单聚合的更多相关文章
- 测试使用索引库crud和高级查询分页
1.搭建ES的服务 导入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifa ...
- 大型运输行业实战_day04_3_高级查询+分页
1.高级查询+分页最终结果 2.分页的本质分析 前端传入:当前页 和 每页显示条数 数据库必须查询出:数据列表 和 总共条数 页面显示包括的数据有: 列表 + 每页显示条数 + 当前页 + 总共 ...
- lucene 查询+分页+排序
lucene 查询+分页+排序 1.定义一个工厂类 LuceneFactory 1 import java.io.IOException; 2 3 import org.apache.lucene.a ...
- SpringBoot 整合 Mybatis 进行CRUD测试开发
今天来和大家分享下 Spring Boot 整合 MyBatis 的 CRUD 测试方法开发.因为 MyBaits 有两种开发形式,一种基于注解,一种基于 xml . SpringBoot配置文件也有 ...
- SpringBoot操作ES进行各种高级查询
SpringBoot整合ES 创建SpringBoot项目,导入 ES 6.2.1 的 RestClient 依赖和 ES 依赖.在项目中直接引用 es-starter 的话会报容器初始化异常错误,导 ...
- SpringBoot整合mybatis使用pageHelper插件进行分页操作
SpringBoot整合mybatis分页操作 SpringBoot整合Mybatis进行分页操作,这里需要使用Mybatis的分页插件:pageHelper, 关于pageHelper的介绍,请查看 ...
- 10月17日下午MySQl数据库CRUD高级查询
高级查询:1.连接查询 #适用于有外键关系的 没有任何关系没法用select * from Info,Nation #同时查询这俩表并把两表每个数据相互组合,形成笛卡尔积 select * from ...
- springboot整合spring data jpa 动态查询
Spring Data JPA虽然大大的简化了持久层的开发,但是在实际开发中,很多地方都需要高级动态查询,在实现动态查询时我们需要用到Criteria API,主要是以下三个: 1.Criteria ...
- springboot整合Beetl、BeetlSql实现ajax分页
Beetl是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,它功能强大,性能良好,超过当前流行的模板引擎.而且还易学易用. BeetSql是一个 ...
随机推荐
- 区块链入门到实战(31)之Solidity – 第一个程序
为简单起见,我们使用在线Solidity开发工具Remix IDE编译和运行Solidity程序. 第1步 – 在File explorers选项卡下,新建一个test1.sol文件,代码如下: 示例 ...
- CentOS 7/8上部署Ceph
Ceph是一个分布式的存储系统,可以在统一的系统中提供唯一的对象.块和文件存储,Ceph的大致组件如下: 1. Ceph监视器(ceph-mon):用来维护集群状态的映射,包括监视器映射,管理器映射, ...
- Python最火的第三方开源测试框架 ——pytest
一.介绍 本篇文章是介绍的是Python 世界中最火的第三方单元测试框架:pytest.它有如下主要特性: assert 断言失败时输出详细信息(再也不用去记忆 self.assert* 名称了) 自 ...
- WPF管理系统开发框架搭建指南,2020从入门到放弃
WPF技术是一个很不错的技术,但一直没有上手过正式的项目,趁在做这个医疗项目时,遂搭建一个WPF开发框架,目的是为了统一WPF开发并提高开发效率:我对WPF技术算是零基础,现学现卖,用这些不成体系的文 ...
- 09.redis 哨兵主备切换时数据丢失的解决方案
一.两种数据丢失的情况 1. 异步复制导致的数据丢失 因为master->slave的复制是异步的,所以可能有部分数据还没复制到slave,master就宕机了,此时这些部分数据就丢失了 2 ...
- 双击Back退出应用 android中弹出吐司
第一种方法: public void onBackPressed() { if (isState) { //isState初始值为true isState = false; Toast.makeTex ...
- oa项目面试准备
熟悉项目在ssm框架下的编程流程,了解mysql html spring springmvc mybatis技术.了解过springboot编程. 在上个寒假跟着培训机构用springboot框架编写 ...
- Java诞生及优势
C语言 1972年诞生 贴近硬件,速度快 指针和内存管理重点 C++ 1982年诞生 面向对象 兼容C 图形领域.游戏等 Java 基于C 没有指针和内存管理 可移植,编写一次到处运行,JVM 面向对 ...
- 做SQL解析时遇到的问题
相对于算术表达式,Json和XML等解析,SQL就比较复杂了. 举个例子来说:符号“(”是目前的SqlAnalyzer1.00中作为进入递归的标志之一,到“)”结束,中间是个查询语句.如果测试用例也是 ...
- 20190919-02安装Xshell和CRT远程工具 000 008
Linux远程登录及相关工具介绍 Linux一般作为服务器使用,而服务器一般放在机房,你不可能在机房操作你的Linux服务器.这时我们就需要远程登录到Linux服务器来管理维护系统. Linux系统中 ...