springboot工程中mongodb使用MongoRepository时嵌套对象的查询方法记录

本文详细介绍了如何使用Spring Data MongoDB进行实体类定义、存储和查询操作,通过具体示例展示了如何创建针对MongoDB的DAO接口,并使用@Query注解进行复杂查询。

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

坑,好大的一个坑,来的先甩个赞

 

先把model扔出来

package com.taikang.domain;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

/**
 * @Author: LiuYan
 * @Description:
 * @Date: Created in 17:01 2019/4/11
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TestModel {

    private String _id;
    private String score;
    private List<HahaModel> list;
}
package com.taikang.domain;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @Author: LiuYan
 * @Description:
 * @Date: Created in 17:03 2019/4/11
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class HahaModel {

    private String age;
    private String name;
}

在mongo库里存储了几个数据

package com.taikang.dao;

import com.taikang.domain.TestModel;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.mongodb.repository.Query;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * @author itw_liuyan01
 * @create 2018-01-08 14:41
 * @desc 智能提醒调用的原子服务
 */
@Repository
public interface TestDao extends MongoRepository<TestModel, String> {

    @Query(value = "{'list.name':'?0','list.age':'?1'}")
    List<TestModel> find(String name, String age);

}

注意啊

"{'list.name':'?0','list.age':'?1'}"

?0这个是占位符,对应方法里的name,?1就是age呗

你其实还可以指定@query里的field,这个是指定查出来哪个值返回给你,具体的别人都写过,搜一下都有

我要说的是?0两边一定要加'',不然条件是两个的时候是会报错的

 

要是就一个"{'list.name':?0}"你这么写也没毛病

这不就查出来了,你要是指定@Query了方法名好像注意点别用by这by那得就行最好别冲突springdata那种命名方式。

 

下面再来几个链接可以看看:

https://www.jianshu.com/p/24a44c4c7651

https://blog.youkuaiyun.com/zhou_xuexi/article/details/77963814

<think>嗯,用户的问题是关于在Spring Boot中整合MongoDB实现连表查询的示例教程。首先,我需要回想一下MongoDB的结构和Spring Boot中的相关支持。记得MongoDB是NoSQL数据库,通常设计为无模式的,所以连表查询不像关系型数据库那样直接。不过,MongoDB从3.2版本开始引入了$lookup操作符,支持类似左外连接的聚合操作。 用户提到他们想用Spring Boot实现这个功能,所以应该需要用到MongoDB的聚合框架。在Spring Boot中,通常有两种方式操作MongoDBMongoRepository和MongoTemplate。对于复杂的聚合操作,MongoTemplate可能更灵活,因为可以直接构建聚合管道。 接下来,我需要检查相关的引用内容。引用[1]提到使用聚合管道中的$facet、$lookup、$unwind和$group等操作符,这可能就是用户需要的。引用[3]指出MongoTemplate用于复杂的高级查询,而MongoRepository通常处理基本操作。因此,示例代码应该使用MongoTemplate来构建聚合管道,特别是使用$lookup来实现连表查询。 用户可能需要具体的代码示例。我应该分步骤说明,比如添加依赖、配置连接、定义实体类,然后编写聚合管道的代码。需要注意MongoDB的版本是否支持$lookup,比如版本3.6+可能需要不同的语法。 另外,用户可能想知道何使用连表查询以及替代方案,比如数据冗余设计。这有助于他们理解是否真的需要连表,或者是否有更好的设计方式。同,性能问题也很重要,因为频繁使用$lookup可能影响效率。 需要确保提供的代码示例正确,比如使用Aggregation.newAggregation方法,并正确引入相关的类,如Aggregation、LookupOperation等。还要提醒用户注意集合名称和字段名的正确对应,避免运行错误。 最后,生成的相关问题应该覆盖用户可能进一步想了解的内容,比如性能优化、多表连接、与JPA的区别以及数据建模建议。这样可以帮助用户更全面地理解主题。</think>### Spring Boot中MongoDB连表查询实现 在MongoDB中实现类似SQL的JOIN查询,主要依赖聚合管道的$lookup操作符。以下是基于Spring Boot的完整实现步骤: #### 1. 添加MongoDB依赖 ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> ``` [^2] #### 2. 配置实体类 ```java // 订单实体 @Document(collection = "orders") public class Order { @Id private String id; private String productId; // 关联产品ID private Integer quantity; } // 产品实体 @Document(collection = "products") public class Product { @Id private String id; private String name; private Double price; } ``` [^4] #### 3. 实现连表查询 ```java @Autowired private MongoTemplate mongoTemplate; public List<OrderWithProduct> getOrdersWithProduct() { LookupOperation lookup = Aggregation.lookup( "products", // 关联集合名 "productId", // 本地字段 "_id", // 外部字段 "productInfo" // 输出字段 ); Aggregation aggregation = Aggregation.newAggregation( lookup, Aggregation.unwind("productInfo") // 展开数组 ); return mongoTemplate.aggregate(aggregation, "orders", OrderWithProduct.class) .getMappedResults(); } ``` [^3] #### 4. 结果映射类 ```java public class OrderWithProduct { private String id; private Integer quantity; private Product productInfo; // 包含关联产品数据 } ``` ### 实现原理说明 1. `$lookup`操作符执行左外连接,将`products`集合中`_id`与`orders`的`productId`匹配的文档合并 2. `unwind`展开嵌套数组,将关联结果转换为对象形式 3. 最终得到包含订单和对应产品信息的复合文档[^1] ### 注意事项 1. MongoDB 3.6+支持更丰富的`$lookup`语法(支持管道嵌套) 2. 频繁使用JOIN可能违反MongoDB设计原则,应考虑数据冗余设计 3. 性能优化可通过添加索引实现: ```java @CompoundIndex(name = "product_idx", def = "{'productId': 1}") public class Order { ... } ```
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值