Spring Boot 自定义查询 MongoDB

Posted

技术标签:

【中文标题】Spring Boot 自定义查询 MongoDB【英文标题】:Spring boot custom query MongoDB 【发布时间】:2019-07-07 04:31:56 【问题描述】:

我有这个 MongoDb 查询:

db.getCollection('user').find(
    $and : [
        "status" : "ACTIVE",
        "last_modified" :  $lt: new Date(), $gte: new Date(new Date().setDate(new Date().getDate()-1)),
        "$expr":  "$ne": ["$last_modified", "$time_created"] 
    ]
)

它可以在 Robo3T 中使用,但是当我将它作为自定义查询放入 spring boot 时,它会在项目启动时引发错误。

@Query(" $and : [ 'status' : 'ACTIVE', 'last_modified' :  $lt: new Date(), $gte: new Date(new Date().setDate(new Date().getDate()-1)), '$expr':  '$ne': ['$last_modified', '$time_created']]")
    public List<User> findModifiedUsers();

我在春季尝试使用Criteria 进行查询:

Query query = new Query();
Criteria criteria = new Criteria();  
criteria.andOperator(Criteria.where("status").is(UserStatus.ACTIVE), Criteria.where("last_modified").lt(new Date()).gt(lastDay), Criteria.where("time_created").ne("last_modified"));

但它不起作用,它返回所有用户,就像没有最后一个条件不等于 last_modifiedtime_created

有谁知道可能是什么问题?

【问题讨论】:

【参考方案1】:

我认为 Criteria 尚不支持此功能 - 检查此 https://jira.spring.io/browse/DATAMONGO-1845 。 一种解决方法是通过 mongoTemplate 传递原始查询,如下所示:

BasicDBList expr = new BasicDBList();
expr.addAll(Arrays.asList("$last_modified","$time_created")); 

BasicDBList and = new BasicDBList();
and.add(new BasicDBObject("status","ACTIVE"));
and.add(new BasicDBObject("last_modified",new BasicDBObject("$lt",new Date()).append("$gte",lastDate)));
and.add(new BasicDBObject("$expr",new BasicDBObject("$ne",expr)));

Document document = new Document("$and",and); 
FindIterable<Document> result = mongoTemplate.getCollection("Users").find(document);

【讨论】:

我编辑了我的答案,只需使用表达式创建新变量 还是不行prntscr.com/mkpsvc, prntscr.com/mkpt6c, prntscr.com/mkptcr

以上是关于Spring Boot 自定义查询 MongoDB的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot MongoDB REST - 自定义存储库方法

Spring Boot,MongoDB,Pageable,按对象中的自定义方法排序

Spring Boot 中的 com.mongodb.util.JSONParseException?

Spring Boot请建议自定义查询

在 Spring Boot 中编写自定义查询

Spring Boot Jpa框架自定义查询语句返回自定义实体