46

我使用弹簧数据MongoDB。

我想要两个日期之间的记录。以下 MongoDB 查询有效:

db.posts.find({startDate: {$gte: start, $lt: end}});

我尝试的 Spring 数据查询对象代码翻译不起作用:

Query query = new Query();
query.addCriteria(Criteria.where("startDate").gte(startDate)
                            .and("startDate").lt(endDate));

构建我需要的 Mongo 查询的方法调用的正确顺序是什么?

4

10 回答 10

98

不要在您的条件中包含 ' and("startDate") ' 部分。

代替 :

query.addCriteria(Criteria.where("startDate").gte(startDate).and("startDate").lt(endDate));

你应该使用:

query.addCriteria(Criteria.where("startDate").gte(startDate).lt(endDate));

当您包含 'and("startDate")' 部分时,Mongo 将其视为同一属性上的两个不同条目。

于 2012-10-29T16:42:19.403 回答
12

参考这里

Query query = new Query(
  Criteria.where("ip").is(ip)
  .andOperator(
    Criteria.where("createdDate").lt(endDate),
    Criteria.where("createdDate").gte(startDate)
  )
);
于 2017-01-30T19:18:42.153 回答
11

您还可以添加查询注释:

@Query("{'date' : { $gte: ?0, $lte: ?1 } }")                 
public List<AnyYourObj> getObjectByDate(Date from, Date to); 

或正确的弹簧数据方法签名:

public List<AnyYourObj> findByDateBetween(Date from, Date to);

这两种方法都给出了相同的结果。你可以在这里阅读更多https://www.baeldung.com/queries-in-spring-data-mongodb 和这里https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/

于 2018-12-24T12:09:33.307 回答
7

我必须找到现场之间的日期publishedDate,这就是我的做法:

    Criteria publishedDateCriteria = Criteria
                        .where("publishedDateObject").gte(psDate)
                        .lte(peDate);
    Query query = new Query(publishedDateCriteria);
    mongoTemplate.find(query,
                        MyDocumentObject.class));
于 2015-09-27T09:39:32.210 回答
4

它有效,他是一些示例代码:

Criteria criteria = Criteria.where("pt").gte(startDate)
       .andOperator(Criteria.where("pt").lt(endDate));
于 2013-08-31T13:39:52.337 回答
4

这适用于 Java 驱动程序的 2.7.2 版本

DBCollection coll = db.getCollection("posts");  

BasicDBObject date = new BasicDBObject();
date.append("$gte", new Date(startDate));
date.append("$lte", new Date(endDate));

DBObject query = new BasicDBObject();
query.put("date", date);

DBCursor cursor = coll.find(query);

此外,为了记录,您对 gte 和 lte 参数都有“startDate”。

于 2012-05-01T09:14:47.943 回答
4

我确实喜欢这个

public interface PolicyRepository extends MongoRepository<Policy, String> {
    @Query("{'lastDate':{$gt:?0,$lt:?1}}")
        public List<Policy> findAllPolicies(Date today,Date somedate);
}
于 2019-08-29T09:29:34.463 回答
3
public interface MyRepository extends MongoRepository<MyObject, MyObjectId> {
    List<MyObject> findByMydatefieldBetween(DateTime startDate, DateTime endDate);
}

https://docs.spring.io/spring-data/mongodb/docs/2.2.x-SNAPSHOT/reference/html/#mongodb.repositories.queries

于 2019-08-16T15:12:57.273 回答
2
if (metaData.getToValue() == null){
dynamicCriteria = Criteria.where("metaData.key").is(metaData.getKey()).andOperator(Criteria.where("metaData.value").is(metaData.getFromValue()));
}else {
dynamicCriteria = Criteria.where("metaData.key").is(metaData.getKey()).orOperator(Criteria.where("metaData.value").gte(metaData.getFromValue()).lt(metaData.getToValue()));
}
于 2020-03-04T11:46:41.007 回答
1

像这样使用 MongoRepository Query 方法:

List<T> findByStartDateBetween(Range<Integer> dataRange);

使用 Range 进行详细范围设置。

类似的问题

于 2021-11-17T09:21:10.800 回答