Spring Data MongoDB 是Spring框架访问mongodb的神器,借助它可以非常方便的读写mongo库。
1.pom.xml中引入依赖(本项目为springboot项目)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
2.application.properties中添加mongodb服务端配置
spring.data.mongodb.uri=mongodb://userName:password@ip:port/test
spring.data.mongodb.databaseName=test
3.注入MongoTemplate
@Autowired
protected MongoTemplate mongoTemplate;
4.聚合操作
//1.创建集合
if (!mongoTemplate.collectionExists(BasicDataCollection.class)) {
mongoTemplate.createCollection(BasicDataCollection.class);
}
//2.查找文档
BasicDataCollection history = mongoTemplate.findOne(new Query(Criteria.where("selectDate").gte(beginDate).lte(endDate)),BasicDataCollection.class);
//3.插入文档
List<BasicDataCollection> basicDataList = new ArrayList<BasicDataCollection>();
... basicDataList赋值略 ...
if (!CollectionUtils.isEmpty(basicDataList)) {
mongoTemplate.insertAll(basicDataList);
}
//4.查询某个集合满足条件的数据总数(多个条件用and()拼接)
Query query = new Query();
query.addCriteria(Criteria.where(ORDER_DATE).lte(dateStr).and(IS_FINISHED_ORDER).is(true) .and(TOTAL_AMOUNT).gt(ORDER_MIN_AMOUNT));//截止某一天总数小于ORDER_MIN_AMOUNT的完成订单
mongoTemplate.count(query, OrderCollection.class);
//5.聚合操作
List<OrderCollection> totalOrderList = new ArrayList<>(OrderCollection);
long totalRecord = this.getOrderCount();
int totalPage = (int)((totalRecord + PAGE_SIZE -1) / PAGE_SIZE);
for (int i = 0; i < totalPage; i++) {
aggregation = Aggregation.newAggregation(
Aggregation.project(ORDER_DATE,IS_FINISHED_ORDER,ENTERPRISE_NAME,USER_ID)
.and(PAID_AMOUNT).plus(INTEGRAL_AMOUNT).as(TOTAL_AMOUNT),
Aggregation.match(Criteria.where(ORDER_DATE).lte(dateStr)
.and(IS_FINISHED_ORDER).is(true).and(TOTAL_AMOUNT).gt(ORDER_MIN_AMOUNT)),
Aggregation.skip(PAGE_SIZE * i),
Aggregation.limit(PAGE_SIZE)
);
List<OrderCollection> pageList = mongoTemplate.aggregate(aggregation,
OrderCollection.class, OrderCollection.class).getMappedResults();
totalOrderList.addAll(pageList);
}
//6.返回删除操作受影响的行数 com.mongodb.WriteResult.getN()
int result = mongoTemplate.remove(new Query(Criteria.where("id").is(id)), Tree.class).getN();
//7.更新操作
Query query = new Query();
query.addCriteria(Criteria.where("_id").is(id));
Update update = new Update();
update.set("updateTime", new Date());
update.set("flag", flag);
mongoTemplate.updateFirst(query, update, OrdersInfo.class);
//8.in/模糊查询/时间范围查询/排序/分页
/**
* 分页查询mongoDB中工单数据
*/
public Pagination<TicketDocument> getTicketList(TicketQueryRequest request) {
Query query = new Query();
if (CollectionUtils.isNotEmpty(request.getIds())) {
query.addCriteria(Criteria.where("_id").in(request.getIds()));
}
// 至少有一个时间条件存在时,才添加到主条件中
Criteria ticketCreateTimeCriteria = new Criteria("ticketCreateTime");
if (request.getStartTime() != null) {
ticketCreateTimeCriteria.gte(request.getStartTime());
}
if (request.getEndTime() != null) {
ticketCreateTimeCriteria.lte(request.getEndTime());
}
if (request.getStartTime() != null || request.getEndTime() != null) {
query.addCriteria(ticketCreateTimeCriteria);
}
// 供应商名称模糊搜索
if (StringUtils.isNotBlank(request.getUserName())) {
query.addCriteria(Criteria.where("userName").regex(request.getUserName(), "i"));
}
query.with(Sort.by(Sort.Direction.DESC, "ticketCreateTime"));
// 分页查询
long totalCount = mongoTemplate.count(query, TicketDocument.class);
Pageable pageable = PageRequest.of(request.getPage() - 1, request.getSize());
List<TicketDocument> tickets = mongoTemplate.find(query.with(pageable), TicketDocument.class);
return PaginationUtil.convertToPagination(totalCount, request.getPage(), request.getSize(), tickets);
}
//9.bulkOps批量操作
private void upsertTickets(List<TicketDocument> documents) {
BulkOperations bulkOps = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, TicketDocument.class);
for (TicketDocument document : documents) {
Query query = new Query(Criteria.where("_id").is(document.getId()));
Update update = new Update();
// 获取文档的所有字段并设置到 Update 对象中
Map<String, Object> fields = objectMapper.convertValue(document, new TypeReference<Map<String, Object>>() {
});
fields.remove("id");
fields.remove("createTime");
for (Map.Entry<String, Object> entry : fields.entrySet()) {
update.set(entry.getKey(), entry.getValue());
}
update.setOnInsert("createTime", new Date());
update.set("modifyTime", new Date());
bulkOps.upsert(query, update);
}
bulkOps.execute();
}
Aggregation.project() 修改文档结构,显示查询的字段;
Aggregation.match() 查询的条件;
Aggregation.skip() 跳过多少条记录;
Aggregation.limit() 查询多少条记录;
此外还有 Aggregation.group() 可以分组操作。
5.原生语句
-- 根据订单号查询记录
db.getCollection('t_orders_info').find({'platformOrderCode':'1625633446050'});
--模糊查询
db.getCollection('t_orders_info').find({'platformOrderCode':{'$regex':'1625633'}});
-- 更新数据
db.getCollection('t_orders_info').update({'platformOrderCode':'1625633446050'},{$set:{'flag':2}});
-- 删除数据
db.t_orders_info.remove({"platformOrderCode":"1625633446050"});
-- 查询记录条数
db.getCollection('t_orders_info').find({}).count();
-- 根据时间范围查询
db.t_orders_info.find({"createTime":{"$gte":ISODate("2021-06-23 05:57:00.860Z"),"$lte":ISODate("2021-07-23 05:57:00.860Z")}}) //某个时间段
db.t_orders_info.find({"createTime":{"$gte":ISODate("2021-07-02 00:00:00.000Z")}})
-- 查询不等于某个字符的数据
db.getCollection('ins_data').find({"is_follow_up":{$ne:false, $exists:true}})