我使用spring data 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 查询的方法调用的正确顺序是什么?
请勿在您的条件中包含 '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 将其视为同一属性上的两个不同条目。
您还可以添加查询注释:
@Query("{'date' : { $gte: ?0, $lte: ?1 } }")
public List<AnyYourObj> getObjectByDate(Date from, Date to);
或者正确的 Spring Data 方法签名:
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/
Query query = new Query(
Criteria.where("ip").is(ip)
.andOperator(
Criteria.where("createdDate").lt(endDate),
Criteria.where("createdDate").gte(startDate)
)
);
我必须找到现场
publishedDate
之间的日期,这就是我的做法:
Criteria publishedDateCriteria = Criteria
.where("publishedDateObject").gte(psDate)
.lte(peDate);
Query query = new Query(publishedDateCriteria);
mongoTemplate.find(query,
MyDocumentObject.class));
我确实喜欢这个
public interface PolicyRepository extends MongoRepository<Policy, String> {
@Query("{'lastDate':{$gt:?0,$lt:?1}}")
public List<Policy> findAllPolicies(Date today,Date somedate);
}
这适用于 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”。
它有效,他是一些示例代码:
Criteria criteria = Criteria.where("pt").gte(startDate)
.andOperator(Criteria.where("pt").lt(endDate));
public interface MyRepository extends MongoRepository<MyObject, MyObjectId> {
List<MyObject> findByMydatefieldBetween(DateTime startDate, DateTime endDate);
}
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()));
}
使用 MongoRepository 查询方法如下:
List<T> findByStartDateBetween(Range<Integer> dataRange);
使用 Range 进行详细范围设置。
您可以尝试下面的查询吗?这应该适合您的情况。
Query query = new Query(
Criteria.andOperator(
Criteria.where("startDate").gte(startDate),
Criteria.where("startDate").lt(endDate)
)
);
Another approach to this could be:
Create a DateUtility class to get LocalDateTime from input LocalDate
public class DateUtility {
public static LocalDateTime toStartOfDay(LocalDate date) {
return Optional.ofNullable(date).map(LocalDate::atStartOfDay).orElse(null);
}
public static LocalDateTime toEndOfDay(LocalDate date) {
return Optional.ofNullable(date).map((localDate) ->
localDate.atTime(LocalTime.MAX)).orElse(null);
}
}
Then use it in the query criteria:
Query query = new Query(); query.addCriteria(Criteria.where("startDate").gt(CommonUtils.toStartOfDay(startDate)).lt(CommonUtils.toEndOfDay(startDate)));
This query will give result from whole day for a given date.