Spring Data MongoDB

本文介绍如何使用SpringData MongoDB进行数据库操作,包括配置依赖、聚合查询、文档增删改查等核心功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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}})


MongoDB 查询文档 | 菜鸟教程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值