Spring数据:mongodb查找带有可选"条件的查询"

时间:2014-03-19 16:08:51

标签: java spring mongodb spring-data spring-data-mongodb

休斯顿,我有一个问题(大家好!)。

我正在使用springdata的@query注释,我需要使用一些标准执行查找查询。

假设我的集合对象是:

  • 日期
  • 帐户{email,firstname,lastname}
  • 状态

我的搜索条件对象是

  • 日期
  • 电子邮件
  • 状态

我需要在集合中搜索符合我标准的文档。

问题是搜索条件不是强制性的,所以我可以有一些空参数(例如,有时我必须找到具有特定代码和日期的文档,有时使用特定的电子邮件等等)所以我开始谷歌搜索解决方案。

我读到了$或$和运算符(我很抱歉和重复),我试图实现一个解决方案(我知道,做或不做,没有尝试但是我对如何使它发挥作用感到非常困惑。

目前的情况是:

@Query(value = "{date: { $exists: false }, key: ?0 , $or : [{$or : [{$where: '?1==null'}, {code : ?1}]},{$or : [{$where: '?2==null'}, {status : ?2}]}]}")
public Page<Notification> findByNotificationCriteria(Pageable page, String key, String code, String status);

(我在开头尝试使用$和运算符)

但结果不是我所期望的。

我做错了什么或者只是一个springdata问题?

感谢。

1 个答案:

答案 0 :(得分:1)

我知道这不是一个真正的解决方案。

  1. 您可以使用query-dsl来完成此任务。这是一个很好的教程:http://www.littlelostmanuals.com/2011/09/spring-mongodb-type-safe-queries.html
  2. (等等)另外看看这个Jira问题,如果这些东西的支持是在spring-jpa中,很快就会出现在mongo中。 https://jira.spring.io/browse/DATAJPA-209
  3. 您也可以直接使用MongoTemplate课程或
  4. 在spring-data中扩展您的存储库。 http://docs.spring.io/spring-data/data-commons/docs/1.6.1.RELEASE/reference/html/repositories.html
  5. 在您的情况下,我会使用query-dsl,因为您必须执行一次并覆盖所有存储库。 (1)

    注意:为了更好一些,请不要使用com.mysema.query.apt.QuerydslAnnotationProcessor而是使用org.springframework.data.mongodb.repository.support.MongoAnnotationProcessor,因为您不必使用query-dsl的@QueryEntity;)

    如果您只有一个存储库,其中有可选参数,请考虑将存储库(4)

    子类化