java - 如何在 Spring Data Mongodb 上使用 SpEL 表达式?

标签 java spring mongodb spring-boot spring-data

我无法弄清楚如何对新引入的字段的现有查询和文档使用 SpEL 表达式。

示例:

@Document(collection = "abc")
public class Abc {

 private boolean deleted;
 public boolean isDeleted() {
  return deleted;
 }

 public void setDeleted(boolean deleted) {
  this.deleted = deleted;
 }

}

我已经在使用 Spring Data Mongodb

@Repository
public interface AbcRepository extends MongoRepository < Abc, String > {

 Abc findAllByDeleted(boolean deleted);

}

注意:我在 abc 集合上有近 1000 多个文档。

我想引入新字段,例如我的集合的状态,但我的查询将发生变化,并且它不会返回任何内容,因为新字段对于旧数据不存在,我该如何处理这种情况?我不想打数据补丁。所以我发现我们可以使用 Spring Data SpEL 表达式中的存在。

https://docs.spring.io/spring-data/mongodb/docs/2.1.0.M3/reference/html/#mongodb.repositories.queries.json-spel

这是我的更改:

@Document(collection = "abc")
public class Abc {
...
...

private boolean status;
 public boolean isStatus() {
  return status;
 }

 public void setStatus(boolean status) {
  this.status = status;
 }
}

我的查询更改为

//Tried this but throwing exception
@Query("{'status' : {$exists :false}}")
Abc findAllByDeletedAndStatus(boolean deleted, boolean status);

如何使用 SpEL 表达式检查状态字段是否存在并应用从调用者传递的参数?

最佳答案

我不确定是否完全理解您的请求,但请参阅下面的一些帮助。

假设 Abc 具有 deletedstatus 属性:

@Query("{ $and :[" +
          "?#{ { 'deleted' : [0] } }," +
          "?#{ { 'status' : [0] } }" +
         "]}")
  Abc findAllByDeletedAndStatus(boolean deleted, boolean status);

如果您的参数是可选的,您可以使用这种方式(这在可选过滤器的情况下非常有用):

  @Query("{ $and :[" +
          "?#{ [0] == null ? { $where : 'true'} : { 'deleted' : [0] } }," +
          "?#{ [1] == null ? { $where : 'true'} : { 'status' : [1] } }" +
       "]}")
  Abc findAllByDeletedAndStatus(boolean deleted, boolean status);

关于java - 如何在 Spring Data Mongodb 上使用 SpEL 表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51605196/

相关文章:

spring - 第三方Spring库中的缓存管理器

java - Spring-ws 一个请求中的多个请求

angularjs - 如何使用node js和angularjs将数组添加到mongodb中?

java - 如何在java.time.Instant中获取和设置指定时间?

java - 如何在括号内的括号内获取带有Java正则表达式的字符串

java - 变量返回但未从方法中更新

java - Eclipse Tomcat 实例试图从不在源代码中的包初始化 spring bean

java - 从 headless (headless)模式启动 Java 桌面应用程序

mongodb - Mongoose:删除项目 - 第一个总是被删除

javascript - 控制台登录 MongoDB 集合。不明确的