当前位置: 首页 > 面试题库 >

Spring Data的MongoTemplate和MongoRepository有什么区别?

危文乐
2023-03-14
问题内容

我需要编写一个应用程序,可以使用spring-data和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?两者都是成熟的,还是其中一个比另一个缺少更多的功能?


问题答案:

“方便”和“使用功能强大”在某种程度上与目标背道而驰。到目前为止,存储库比模板方便得多,但是后者当然可以为你提供对执行内容的更细粒度的控制。

由于存储库编程模型可用于多个Spring Data模块,因此你可以在Spring Data MongoDB 参考文档的常规部分中找到有关它的更多详细文档。

TL; DR

我们通常建议采用以下方法:

从存储库摘要开始,仅使用查询派生机制或手动定义的查询声明简单查询。
对于更复杂的查询,将手动实现的方法添加到存储库中(如此处所述)。供实现使用MongoTemplate。
细节

对于你的示例,这看起来像这样:

  1. 为你的自定义代码定义一个接口:
interface CustomUserRepository {

  List<User> yourCustomMethod();
}
  1. 为该类添加一个实现,并遵循命名约定以确保我们可以找到该类。
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
  }
}
  1. 现在,让你的基本存储库界面扩展自定义界面,基础结构将自动使用你的自定义实现:
interface UserRepository extends CrudRepository<User, Long>, CustomUserRepository {

}


 类似资料:
  • 我需要编写一个应用程序,用它我可以使用spring数据和MongoDB进行复杂的查询。我开始使用MongoRepository,但在复杂的查询中很难找到示例或真正理解语法。 我说的是这样的问题: 或者使用基于JSON的查询,因为语法不对,所以我试了一遍又一遍。即使在阅读了mongodb文档之后(由于语法错误,不工作的示例)。 在通读了所有文档之后,似乎的文档要比好得多。我指的是以下文档: http

  • 我有一个应用程序有多个mongo配置。这是通过一些@Configuration类实现的,比如 配置1——应用程序 配置2--测试 然后在我的房子里 因此,两个mongo配置连接到本地运行但具有不同数据库的实例。我也尝试过使用不同的地址,但它的行为相同。 不管怎么说,这将通过实体和MongoRepository来使用 回购 然而,当我在某个地方的课堂上使用它时 此对象被写入,而不是我所期望的,因为它

  • 问题内容: 两者都意味着空间,但是有什么区别吗? 问题答案: 一个是不间断空间,另一个是常规空间。不间断的空格表示该行不应在该点处换行,就像它不会在一个单词的中间换行一样。 此外,正如斯文德(Svend)在其评论中指出的那样,不间断的空间不会崩溃。

  • 本文向大家介绍<%# %> 和 <% %> 有什么区别?相关面试题,主要包含被问及<%# %> 和 <% %> 有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 答:<%# %>表示绑定的数据源 <%%>是服务器端代码块  

  • 问题内容: 以下代码之间有什么区别: 和 Python建议采用一种做事方式,但有时似乎不止一种。 问题答案: 一个是函数调用,一个是文字: 使用第二种形式。它更具Python风格,并且可能更快(因为它不涉及加载和调用单独的函数)。

  • 问题内容: 我一直认为Java 中的运算符用于验证其两个布尔操作数是否均为,并且该&运算符用于对两种整数类型进行按位运算。 最近我知道,也可以使用运算符来验证其两个布尔操作数是否均为,唯一的区别是即使LHS操作数为false,它也会检查RHS操作数。 Java中的运算符是否在内部重载?还是在这背后有其他概念? 问题答案: <-验证两个操作数 <-停止评估第一个操作数是否为false,因为结果为fa