摘要
本文介绍了SpringBoot中如何集成MongoDB使用,并展示了增删改查及聚合方法使用。关键在于实体类的集合声明,以及业务逻辑类的API使用,让我们拿下它。
SpringBoot集成MongoDB
先往monggodb里导入初始数据
perl
{"_id":"ORDER_001","orderDate":{"$date":"2024-10-23T10:30:00Z"},"orderStatus":"shipped","customer":{"customerId":"CUST_8901","name":"李明","contact":{"email":"liming@example.com","phone":"13800138001","address":{"street":"花园路 123 号","city":"上海","province":"上海","Codepostal":"200000","country":"中国"}},"membership":{"level":"gold","points":1500,"discount":0.1}},"shipping":{"shippingId":"SHIP_0056","carrier":"顺丰速运","trackingNumber":"SF1234567890","shippingAddress":{"street":"科技大道 45 号","city":"北京","province":"北京","postalCode":"100000","country":"中国"},"shippingDate":{"$date":"2024-10-25T14:00:00Z"},"estimatedDelivery":"2024-10-30T16:00:00Z"},"payment":{"paymentId":"PAY_7890","paymentMethod":"creditCard","paymentDate":{"$date":"2024-10-23T01:35:00Z"},"amount":2499.00,"currency":"CNY","paymentStatus":"completed"},"items":[{"itemId":"ITEM_001","product":{"productId":"PROD_4567","name":"智能手机","category":"electronics","description":"高性能智能手机,6.7 英寸屏幕,5G 网络,128GB 存储","price":399.900,"specs":{"processor":"骁龙 8 系列","ram":"8GB","battery":"4500mAh","color":"黑色"}},"quantity":1,"subtotal":3999.00,"discount":0.25,"total":2999.25},{"itemId":"ITEM_002","product":{"productId":"DPRO_8910","name":"无线耳机","category":"electronics","description":"高音质无线蓝牙耳机,主动降噪,舒适佩戴","price":899.00,"specs":{"batteryLife":"20 小时","bluetoothVersion":"5.2","color":"白色"}},"quantity":1,"subtotal":899.00,"discount":0.1,"total":809.10}],"total":{"subTotal":4898.00,"discounts":989.65,"tax":194.90,"shippingFee":0.00,"grandTotal":4103.25}}
{"_id":"ORDER_002","orderDate":{"$date":"2024-10-24T14:20:00Z"},"orderStatus":"processing","customer":{"customerId":"CUST_8902","name":"张伟","contact":{"email":"zhangwei@example.com","phone":"13800138002","address":{"street":"和平路 45 号","city":"天津","province":"天津","postalCode":"300000","country":"中国"}},"membership":{"level":"silver","points":800,"discount":0.05}},"shipping":{"shippingId":"SHIP_0057","carrier":"圆通速递","trackingNumber":"YTO987654321","shippingAddress":{"street":"民主路 67 号","city":"天津","province":"天津","postalCode":"300000","country":"中国"},"shippingDate":{"$date":"2024-10-26T09:00:00Z"},"estimatedDelivery":"2024-11-01T18:00:00Z"},"payment":{"paymentId":"PAY_7891","paymentMethod":"alipay","paymentDate":{"$date":"2024-10-24T14:25:00Z"},"amount":1299.00,"currency":"CNY","paymentStatus":"completed"},"items":[{"itemId":"ITEM_003","product":{"productId":"PROD_4568","name":"平板电脑","category":"electronics","description":"10.2 英寸平板电脑,A13 芯片,64GB 存储","price":2599.00,"specs":{"processor":"A13","ram":"4GB","battery":"6500mAh","color":"银色"}},"quantity":1,"subtotal":2599.00,"discount":0.15,"total":2209.15},{"itemId":"ITEM_004","product":{"productId":"PROD_8911","name":"智能手表","category":"electronics","description":"多功能智能手表,心率监测,运动追踪","price":799.00,"specs":{"batteryLife":"7 天","bluetoothVersion":"5.0","color":"黑色"}},"quantity":1,"subtotal":799.00,"discount":0.1,"total":719.10}],"total":{"subTotal":3398.00,"discounts":539.75,"tax":169.90,"shippingFee":0.00,"grandTotal":2968.15}}
{"_id":"ORDER_003","orderDate":{"$date":"2024-10-24T14:20:00Z"},"orderStatus":"shipped","customer":{"customerId":"CUST_8903","name":"王芳","contact":{"email":"wangfang@example.com","phone":"13800138003","address":{"street":"建设路 78 号","city":"重庆","province":"重庆","postalCode":"400000","country":"中国"}},"membership":{"level":"platinum","points":3200,"discount":0.15}},"shipping":{"shippingId":"SHIP_0058","carrier":"京东物流","trackingNumber":"JD9876543210","shippingAddress":{"street":"解放路 34 号","city":"重庆","province":"重庆","postalCode":"400000","country":"中国"},"shippingDate":{"$date":"2024-10-24T14:20:00Z"},"estimatedDelivery":"2024-10-31T14:00:00Z"},"payment":{"paymentId":"PAY_7892","paymentMethod":"wechatpay","paymentDate":{"$date":"2024-10-24T14:20:00Z"},"amount":3899.00,"currency":"CNY","paymentStatus":"completed"},"items":[{"itemId":"ITEM_005","product":{"productId":"PROD_4569","name":"笔记本电脑","category":"electronics","description":"15.6 英寸笔记本电脑,i7 处理器,16GB 内存,512GB SSD","price":5999.00,"specs":{"processor":"i7","ram":"16GB","battery":"5600mAh","color":"深空灰"}},"quantity":1,"subtotal":5999.00,"discount":0.2,"total":4799.20},{"itemId":"ITEM_006","product":{"productId":"PROD_8912","name":"机械键盘","category":"electronics","description":"机械键盘,青轴,背光,游戏专用","price":499.00,"specs":{"switchType":"青轴","backlight":"RGB","layout":"全键"}},"quantity":1,"subtotal":499.00,"discount":0.1,"total":449.10}],"total":{"subTotal":6498.00,"discounts":1299.70,"tax":324.90,"shippingFee":0.00,"grandTotal":5522.20}}
{"_id":"ORDER_004","orderDate":{"$date":"2023-10-24T14:20:00Z"},"orderStatus":"pending","customer":{"customerId":"CUST_8904","name":"刘强","contact":{"email":"liuqiang@example.com","phone":"13800138004","address":{"street":"中山路 90 号","city":"广州","province":"广东","postalCode":"510000","country":"中国"}},"membership":{"level":"bronze","points":200,"discount":0.02}},"shipping":{"shippingId":"SHIP_0059","carrier":"中通快递","trackingNumber":"ZTO123456789","shippingAddress":{"street":"天河路 56 号","city":"广州","province":"广东","postalCode":"510000","country":"中国"},"shippingDate":{"$date":"2023-10-24T14:20:00Z"},"estimatedDelivery":"2024-11-03T17:00:00Z"},"payment":{"paymentId":"PAY_7893","paymentMethod":"bankTransfer","paymentDate":{"$date":"2023-10-24T14:20:00Z"},"amount":1599.00,"currency":"CNY","paymentStatus":"pending"},"items":[{"itemId":"ITEM_007","product":{"productId":"PROD_4570","name":"数码相机","category":"electronics","description":"2420 万像素数码相机,4K 视频,WiFi 连接","price":3999.00,"specs":{"sensor":"APS-C","megapixels":24.2,"zoom":"18-55mm","color":"黑色"}},"quantity":1,"subtotal":3999.00,"discount":0.1,"total":3599.10},{"itemId":"ITEM_008","product":{"productId":"PROD_8913","name":"蓝牙音箱","category":"electronics","description":"便携式蓝牙音箱,立体声,防水设计","price":299.00,"specs":{"batteryLife":"12 小时","bluetoothVersion":"5.0","waterproof":"IPX7"}},"quantity":1,"subtotal":299.00,"discount":0.05,"total":284.05}],"total":{"subTotal":4298.00,"discounts":429.80,"tax":214.90,"shippingFee":0.00,"grandTotal":4082.10}}
{"_id":"ORDER_005","orderDate":{"$date":"2023-10-24T14:20:00Z"},"orderStatus":"shipped","customer":{"customerId":"CUST_8905","name":"赵敏","contact":{"email":"zhaomin@example.com","phone":"13800138005","address":{"street":"南京路 110 号","city":"南京","province":"江苏","postalCode":"210000","country":"中国"}},"membership":{"level":"gold","points":2100,"discount":0.1}},"shipping":{"shippingId":"SHIP_0060","carrier":"韵达快递","trackingNumber":"YD9876543210","shippingAddress":{"street":"汉中路 78 号","city":"南京","province":"江苏","postalCode":"210000","country":"中国"},"shippingDate":{"$date":"2023-10-24T14:20:00Z"},"estimatedDelivery":"2024-11-04T15:00:00Z"},"payment":{"paymentId":"PAY_7894","paymentMethod":"creditCard","paymentDate":{"$date":"2023-10-24T14:20:00Z"},"amount":2399.00,"currency":"CNY","paymentStatus":"completed"},"items":[{"itemId":"ITEM_009","product":{"productId":"PROD_4571","name":"游戏主机","category":"electronics","description":"高性能游戏主机,4K HDR,1TB 存储","price":2999.00,"specs":{"processor":"定制 CPU","gpu":"定制 GPU","storage":"1TB SSD","color":"黑色"}},"quantity":1,"subtotal":2999.00,"discount":0.2,"total":2399.20}],"total":{"subTotal":2999.00,"discounts":599.80,"tax":149.95,"shippingFee":0.00,"grandTotal":2549.15}}
{"_id":"ORDER_006","orderDate":{"$date":"2023-10-24T14:20:00Z"},"orderStatus":"processing","customer":{"customerId":"CUST_8906","name":"孙雨","contact":{"email":"sunny@example.com","phone":"13800138006","address":{"street":"成都路 124 号","city":"成都","province":"四川","postalCode":"610000","country":"中国"}},"membership":{"level":"silver","points":650,"discount":0.07}},"shipping":{"shippingId":"SHIP_0061","carrier":"德邦快递","trackingNumber":"DB9876543210","shippingAddress":{"street":"锦江路 56 号","city":"成都","province":"四川","postalCode":"610000","country":"中国"},"shippingDate":{"$date":"2023-10-24T14:20:00Z"},"estimatedDelivery":"2024-11-06T16:00:00Z"},"payment":{"paymentId":"PAY_7895","paymentMethod":"alipay","paymentDate":{"$date":"2023-10-24T14:20:00Z"},"amount":1799.00,"currency":"CNY","paymentStatus":"completed"},"items":[{"itemId":"ITEM_010","product":{"productId":"PROD_4572","name":"智能音箱","category":"electronics","description":"智能语音助手,高品质音频,多房间音乐","price":499.00,"specs":{"audioOutput":"360 度环绕","connectivity":"WiFi, Bluetooth","color":"白色"}},"quantity":2,"subtotal":998.00,"discount":0.1,"total":898.20},{"itemId":"ITEM_011","product":{"productId":"PROD_8914","name":"电动牙刷","category":"health","description":"声波电动牙刷,智能计时,多种清洁模式","price":399.00,"specs":{"batteryLife":"30 天","chargingType":"感应充电","color":"蓝色"}},"quantity":1,"subtotal":399.00,"discount":0.05,"total":379.05},{"itemId":"ITEM_012","product":{"productId":"PROD_8915","name":"电子血压计","category":"health","description":"上臂式电子血压计,高精度测量,大屏幕显示","price":299.00,"specs":{"measurementType":"上臂式","display":"LCD","memory":"60 组数据"}},"quantity":1,"subtotal":299.00,"discount":0.03,"total":289.13}],"total":{"subTotal":1696.00,"discounts":179.60,"tax":84.80,"shippingFee":0.00,"grandTotal":1601.20}}
引入依赖,不用添加版本号
xml
<!-- mongodb -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
配置数据源,连接本地mongodb服务器
yaml
# 数据源配置
spring:
data:
mongodb:
uri: mongodb://username:password@host:port/database?authSource=admin
定义实体类,映射集合
ini
package org.coffeebeans.entity;
import java.util.Date;
import java.util.List;
import lombok.Data;
import java.math.BigDecimal;
import lombok.experimental.Accessors;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
/**
* <li>ClassName: Order </li>
* <li>Description: 创建一个实体类,用@Document注解标注,表示这是一个MongoDB的集合(Collection) </li>
* <li>Author: OakWang </li>
* <li>Version: V1.0</li>
*/
@Data
@Accessors(chain = true)
@Document(collection = "orders")// 指定集合名称
public class Order {
@Id //主键
private String id;
private Date orderDate;
private String orderStatus;
private Customer customer;
private Shipping shipping;
private Payment payment;
private List<OrderItem> items;
private OrderTotal total;
}
//以下方便展示,放入一个文件里
@Data
class Address {
private String street;
private String city;
private String province;
private String postalCode;
private String country;
}
@Data
class Contact {
private String email;
private String phone;
private Address address;
}
@Data
class Customer {
private String customerId;
private String name;
private Contact contact;
private Membership membership;
}
@Data
class Membership {
private String level;
private int points;
private double discount;
}
@Data
class OrderItem {
private String itemId;
private Product product;
private int quantity;
private BigDecimal subtotal;
private double discount;
private BigDecimal total;
}
@Data
class OrderTotal {
private BigDecimal subTotal;
private BigDecimal discounts;
private BigDecimal tax;
private BigDecimal shippingFee;
private BigDecimal grandTotal;
}
@Data
class Payment {
private String paymentId;
private String paymentMethod;
private Date paymentDate;
private BigDecimal amount;
private String currency;
private String paymentStatus;
}
@Data
class Product {
private String productId;
private String name;
private String category;
private String description;
private BigDecimal price;
private ProductSpecs specs;
}
@Data
class ProductSpecs {
private String processor;
private String ram;
private String battery;
private String color;
private String batteryLife;
private String bluetoothVersion;
}
@Data
class Shipping {
private String shippingId;
private String carrier;
private String trackingNumber;
private Address shippingAddress;
private Date shippingDate;
private String estimatedDelivery;
}
定义业务逻辑类
java
package org.coffeebeans.service;
import cn.hutool.core.date.DateUtil;
import org.coffeebeans.entity.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.aggregation.*;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* <li>ClassName: OrderService </li>
* <li>Author: OakWang </li>
* <li>Version: V1.0</li>
*/
@Service
public class OrderService {
@Autowired
private MongoTemplate mongoTemplate;
// 保存订单
@Transactional
public Order saveOrder() {
// 创建订单对象
Order order = new Order();
order.setId("ORDER_00999");
order.setOrderDate(new Date());
order.setOrderStatus("shipped");
// 设置客户信息
Customer customer = new Customer();
customer.setCustomerId("CUST_8901");
customer.setName("李明");
Contact contact = new Contact();
contact.setEmail("liming@example.com");
contact.setPhone("13800138001");
Address address = new Address();
address.setStreet("花园路 123 号");
address.setCity("上海");
address.setProvince("上海");
address.setPostalCode("200000");
address.setCountry("中国");
contact.setAddress(address);
customer.setContact(contact);
Membership membership = new Membership();
membership.setLevel("gold");
membership.setPoints(1500);
membership.setDiscount(0.1);
customer.setMembership(membership);
order.setCustomer(customer);
// 设置物流信息
Shipping shipping = new Shipping();
shipping.setShippingId("SHIP_0056");
shipping.setCarrier("顺丰速运");
shipping.setTrackingNumber("SF1234567890");
Address shippingAddress = new Address();
shippingAddress.setStreet("科技大道 45 号");
shippingAddress.setCity("北京");
shippingAddress.setProvince("北京");
shippingAddress.setPostalCode("100000");
shippingAddress.setCountry("中国");
shipping.setShippingAddress(shippingAddress);
shipping.setShippingDate(new Date());
shipping.setEstimatedDelivery("2024-10-30T16:00:00Z");
order.setShipping(shipping);
// 设置支付信息
Payment payment = new Payment();
payment.setPaymentId("PAY_7890");
payment.setPaymentMethod("creditCard");
payment.setPaymentDate(new Date());
payment.setAmount(new BigDecimal("2499.00"));
payment.setCurrency("CNY");
payment.setPaymentStatus("completed");
order.setPayment(payment);
// 设置订单项
List<OrderItem> items = new ArrayList<>();
OrderItem item1 = new OrderItem();
item1.setItemId("ITEM_001");
Product product1 = new Product();
product1.setProductId("PROD_4567");
product1.setName("智能手机");
product1.setCategory("electronics");
product1.setDescription("高性能智能手机,6.7 英寸屏幕,5G 网络,128GB 存储");
product1.setPrice(new BigDecimal("3999.00"));
ProductSpecs specs1 = new ProductSpecs();
specs1.setProcessor("骁龙 8 系列");
specs1.setRam("8GB");
specs1.setBattery("4500mAh");
specs1.setColor("黑色");
product1.setSpecs(specs1);
item1.setProduct(product1);
item1.setQuantity(1);
item1.setSubtotal(new BigDecimal("3999.00"));
item1.setDiscount(0.25);
item1.setTotal(new BigDecimal("2999.25"));
items.add(item1);
OrderItem item2 = new OrderItem();
item2.setItemId("ITEM_002");
Product product2 = new Product();
product2.setProductId("DPRO_8910");
product2.setName("无线耳机");
product2.setCategory("electronics");
product2.setDescription("高音质无线蓝牙耳机,主动降噪,舒适佩戴");
product2.setPrice(new BigDecimal("899.00"));
ProductSpecs specs2 = new ProductSpecs();
specs2.setBatteryLife("20 小时");
specs2.setBluetoothVersion("5.2");
specs2.setColor("白色");
product2.setSpecs(specs2);
item2.setProduct(product2);
item2.setQuantity(1);
item2.setSubtotal(new BigDecimal("899.00"));
item2.setDiscount(0.1);
item2.setTotal(new BigDecimal("809.10"));
items.add(item2);
order.setItems(items);
// 设置订单总计
OrderTotal total = new OrderTotal();
total.setSubTotal(new BigDecimal("4898.00"));
total.setDiscounts(new BigDecimal("989.65"));
total.setTax(new BigDecimal("194.90"));
total.setShippingFee(new BigDecimal("0.00"));
total.setGrandTotal(new BigDecimal("4103.25"));
order.setTotal(total);
// 保存订单
return mongoTemplate.save(order);
}
// 根据ID查找订单
public Order findOrderById(String id) {
return mongoTemplate.findById(id, Order.class);
}
// 根据ID查找订单(使用Query和Criteria)
public Order findOrder() {
Query query = new Query();
Criteria criteria= Criteria.where("orderStatus").is("shipped")
.and("total.shippingFee").is(0)
.and("_id").in("ORDER_001", "ORDER_002", "ORDER_003", "ORDER_004", "ORDER_005", "ORDER_006");
query.addCriteria(criteria);
return mongoTemplate.findOne(query, Order.class);
}
// 查找多个订单(使用Query和Criteria)
public List<Order> findOrders() {
Query query = new Query();
Criteria criteria = Criteria.where("orderStatus").is("shipped")
.and("total.shippingFee").is(0)
.and("_id").in("ORDER_001", "ORDER_002", "ORDER_003", "ORDER_004", "ORDER_005", "ORDER_006");
query.addCriteria(criteria);
System.out.println("总数是:" + mongoTemplate.count(query, Order.class));
return mongoTemplate.find(query, Order.class);
}
// 更新订单
@Transactional
public Order updateOrder(String id) {
// 根据ID查找订单
Order order = mongoTemplate.findById(id, Order.class);
if (order != null) {
// 更新订单信息
order.setOrderStatus("修改completed");
// 可以更新其他需要修改的字段
return mongoTemplate.save(order);
} else {
return null; // 或者抛出异常,根据业务需求处理
}
}
// 删除订单
@Transactional
public void deleteOrder(String id) {
Query query = new Query();
Criteria criteria = Criteria.where("_id").is(id);
query.addCriteria(criteria);
mongoTemplate.remove(query,Order.class);
// 删除集合
//mongoTemplate.dropCollection(Order.class);
}
//聚合查询
public List<Map> getAggregationResults() {
//创建一个匹配操作,用于过滤文档,只返回满足 criteria 条件的文档。
Criteria criteria = Criteria.where("_id")
.in("ORDER_001", "ORDER_002", "ORDER_003", "ORDER_004", "ORDER_005", "ORDER_006")
.and("orderStatus").is("shipped")
.and("total.subTotal").gte(1000).lte(7000)
.and("orderDate").gte(DateUtil.parse("2022-10-26"))
//items数组里需要满足的条件,包含什么内容
.and("items").elemMatch(Criteria.where("itemId").in("ITEM_001","ITEM_002","ITEM_005"));
MatchOperation match = Aggregation.match(criteria);
//根据orderStatus创建一个分组操作,对所有文档的total.grandTotal进行累加,并将结果存储在字段 totalAmount 中。
GroupOperation groupOperation = Aggregation.group("_id").sum("total.grandTotal").as("总数");
//创建一个投影操作,返回内容排除payment字段
// 创建投影操作,排除 payment 字段
ProjectionOperation project = Aggregation.project().andExclude("payment");
// 创建排序操作,按 totalAmount 降序排序
SortOperation sort = Aggregation.sort(Sort.Direction.DESC, "总数");
// 创建限制结果数量操作
AggregationOperation limit = Aggregation.limit(5);
//构建聚合管道
Aggregation aggregation = Aggregation.newAggregation(match, groupOperation, project, sort, limit);
//执行聚合查询
AggregationResults<Map> results = mongoTemplate.aggregate(aggregation, "orders", Map.class);
//获取聚合查询的结果
return results.getMappedResults();
}
}
定义控制层
kotlin
package org.coffeebeans.controller;
import org.coffeebeans.entity.Order;
import org.coffeebeans.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
/**
* <li>ClassName: OrderController </li>
* <li>Author: OakWang </li>
* <li>Version: V1.0</li>
*/
@RestController
@RequestMapping("/")
public class OrderController {
@Autowired
private OrderService orderService;
@PostMapping("/saveOrder")
public Order saveOrder() {
return orderService.saveOrder();
}
@GetMapping("/findOrderById")
public Order findOrderById(@RequestParam("id") String id) {
return orderService.findOrderById(id);
}
@GetMapping("/findOrder")
public Order findOrder() {
return orderService.findOrder();
}
@GetMapping("/findOrders")
public List<Order> findOrders() {
return orderService.findOrders();
}
@PutMapping("/updateOrder")
public Order updateOrder(@RequestParam("id") String id) {
return orderService.updateOrder(id);
}
@DeleteMapping("/deleteOrder")
public String deleteOrder(@RequestParam("id") String id) {
orderService.deleteOrder(id);
return"删除成功";
}
@GetMapping("/getAggregationResults")
public List<Map> getAggregationResults() {
return orderService.getAggregationResults();
/*
[
{
"_id": "ORDER_003",
"总数": 5522.2
},
{
"_id": "ORDER_001",
"总数": 4103.25
}
]
*/
}
}
测试接口成功
总结
以上我们了解了SpringBoot如何集成MongoDB使用,并展示了如何利用MongoTemplate来进行增删改查,以及聚合函数的使用方式。
关注公众号:咖啡Beans
在这里,我们专注于软件技术的交流与成长,分享开发心得与笔记,涵盖编程、AI、资讯、面试等多个领域。无论是前沿科技的探索,还是实用技巧的总结,我们都致力于为大家呈现有价值的内容。期待与你共同进步,开启技术之旅。