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

我说的是这样的问题:

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

或者使用基于JSON的查询,我try 了反复try ,因为我没有正确的语法.甚至在阅读了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数据模块,因此您将在Spring Data MongoDB reference docs的概述部分找到更深入的文档.

TL;DR

我们通常推荐以下方法:

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

Details

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

  1. 为自定义代码定义一个接口:

    interface CustomUserRepository {
    
      List<User> yourCustomMethod();
    }
    
  2. 为这个类添加一个实现,并遵循命名约定,确保我们可以找到这个类.

    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
      }
    }
    
  3. 现在,让您的基础存储库接口扩展自定义接口,基础 struct 将自动使用您的自定义实现:

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

通过这种方式,你基本上可以 Select :所有易于声明的内容都进入UserRepository,所有更好地手动实现的内容都进入CustomUserRepository.定制选项记录在here中.

Mongodb相关问答推荐

更新查询mongoose 中的礼宾更新字段

MongoDB Aggregate:查找每个月的交叉日期范围的数量

如何通过 Go 以 UUID 类型保存 Mongo 中的内容?

我无法在react 中使用 fetch 和express 从数据库中删除数据

MongoDB:从开始日期和结束日期数组中匹配特定日期的聚合查询

使用 mongo-driver/mongo 使用键/值对中的值表达式查找文档

根据条件删除一些数组元素并将数组的大小更新为mongo中的另一个文件

在 DBeaver 中连接到 Redis 或 MongoDB

删除一对一和一对多引用 - Mongoose

MongoDB - 如果新值更大,则更新字段

如果 mongoDB 服务器正在运行,如何从驱动程序判断

为什么 local.oplog.rs 上每隔几分钟的活动就会锁定 mongo 客户端

MongoDB插入引发重复键错误

如何使用 Node.js 和 mongoose 解决command find requires authentication?

mongoose:按字母顺序排序

如何将转储文件夹导入 mongodb 数据库?

MongoDb 连接被拒绝

MongoDB:聚合框架: $match between fields

Meteor 发布/订阅独特客户端集合的策略

带有条件的MongoDB聚合查找