当前位置: 首页 > 知识库问答 >
问题:

spring数据的MongoTemplate和MongoRepository有什么区别?

刘弘新
2023-03-14

我需要编写一个应用程序,用它我可以使用spring数据和MongoDB进行复杂的查询。我开始使用MongoRepository,但在复杂的查询中很难找到示例或真正理解语法。

我说的是这样的问题:

@Repository
public interface UserRepositoryInterface extends MongoRepository<User, String> {
    List<User> findByEmailOrLastName(String email, String lastName);
}

或者使用基于JSON的查询,因为语法不对,所以我试了一遍又一遍。即使在阅读了mongodb文档之后(由于语法错误,不工作的示例)。

@Repository
public interface UserRepositoryInterface extends MongoRepository<User, String> {
    @Query("'$or':[{'firstName':{'$regex':?0,'$options':'i'}},{'lastName':{'$regex':?0,'$options':'i'}}]")
    List<User> findByEmailOrFirstnameOrLastnameLike(String searchText);
} 

在通读了所有文档之后,似乎MongoTemplate的文档要比MongoRepository好得多。我指的是以下文档:

http://static.springsource.org/spring-data/data-mongodb/docs/current/reference/html/

你能告诉我用什么更方便更强大吗?MongoTemplate还是MongoRepository?是两个都一样成熟,还是其中一个比另一个缺少更多的特征?

共有1个答案

微生宝
2023-03-14

“方便”和“功能强大”在某种程度上是矛盾的目标。存储库要比模板方便得多,但模板当然为您提供了对执行内容的更细粒度的控制。

由于存储库编程模型可用于多个spring数据模块,您将在spring数据MongoDB参考文档的general部分找到关于它的更深入的文档。

DR

我们一般建议采用以下方法:

  1. 从存储库摘要开始,使用查询派生机制或手动定义的查询声明简单查询。
  2. 对于更复杂的查询,请将手动实现的方法添加到存储库中(如本文所述)。有关实现,请使用MongoTemplate.

详细信息

在您的示例中,它看起来如下所示:

>

  • 为自定义代码定义接口:

    interface CustomUserRepository {
    
      List<User> yourCustomMethod();
    }
    

    为这个类添加一个实现,并遵循命名约定,以确保我们可以找到这个类。

    class UserRepositoryImpl implements CustomUserRepository {
    
      private final MongoOperations operations;
    
      @Autowired
      public UserRepositoryImpl(MongoOperations operations) {
    
        Assert.notNull(operations, "MongoOperations must not be null!");
        this.operations = operations;
      }
    
      public List<User> yourCustomMethod() {
        // custom implementation here
      }
    }
    

    现在,让您的基本存储库接口扩展自定义存储库接口,基础结构将自动使用您的自定义实现:

    interface UserRepository extends CrudRepository<User, Long>, CustomUserRepository {
    
    }
    

    通过这种方式,您基本上可以选择:所有易于声明的内容都放入userrepository中,所有更好地手动实现的内容都放入customuserrepository中。此处记录了自定义选项。

  •  类似资料:
    • 问题内容: 我需要编写一个应用程序,可以使用spring-data和mongodb进行复杂的查询。我一直从使用MongoRepository开始,但是在复杂的查询中苦苦寻找实例或真正理解语法。 我说的是这样的查询: 或使用基于JSON的查询,但由于语法不正确,因此尝试并尝试了它。即使在阅读了文档之后(由于语法错误,仍无法正常工作的示例)。 阅读完所有文档后,似乎mongoTemplate文档要好得

    • Hibernate和Spring数据JPA之间的主要区别是什么? 我们什么时候不应该使用Hibernate或Spring数据JPA? 此外,何时SpringJDBC模板可以比Hibernate和SpringDataJPA性能更好?

    • 本文向大家介绍Spring Boot、Spring MVC 和 Spring 有什么区别?相关面试题,主要包含被问及Spring Boot、Spring MVC 和 Spring 有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 SpringFramework SpringFramework 最重要的特征是依赖注入。所有 SpringModules 不是依赖注入就是 IOC 控制反转。 当我

    • 本文向大家介绍Dubbo 和 Spring Cloud 有什么区别?相关面试题,主要包含被问及Dubbo 和 Spring Cloud 有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 两个没关联,如果硬要说区别,有以下几点。 1)通信方式不同 Dubbo 使用的是 RPC 通信,而 Spring Cloud 使用的是 HTTP RESTFul 方式。 2)组成部分不同 最大的区别:Dubb

    • 给出了以下配置: 我需要一个存储库来访问电影,看起来有点像这样: 是否有一种注释驱动的方法来告诉存储库要使用哪个模板?如果没有,还能做些什么来解决这个问题?