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

时间:2018-07-31 03:49:52

标签: 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);

}

注意:我有大约1000多个关于abc集合的文档。

我想在收藏夹中引入新字段(例如状态),查询将更改,并且不会返回任何信息,因为新字段不存在且旧数据不存在,我该怎么办?处理这种情况?我不想做数据修补。所以我发现我们可以使用spring数据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表达式来检查状态字段是否存在并应用从调用方传递的参数?

1 个答案:

答案 0 :(得分:0)

我不确定您是否完全了解您的要求,但是请多多帮助。

假设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);