Spring Data MongoDB 日期范围查询

53

我使用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查询?


当您多次输入fieldName(例如startDate)时,会出现InvalidMongoDbApiUsageException错误...您不能添加第二个“startDate”... - Hamedz
1
__startDate__和__endDate__的类型是什么? - Dirk Schumacher
13个回答

114
不要在您的条件中包含“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会将其视为同一属性上的两个不同条目。


4
这是完全正确的答案,应该标记为正确。 - Fredrik Wallenius
4
这里需要说明的是,“startDate”和“endDate”是Java的“java.util.Date”对象,将生成一个MongoDB查询,例如:“startDate”:{“$ gte”:{“$ date”:“2014-09-01T07: 00:00.000Z”},“$ lt”:{“$ date”:“2014-10-01T07:00:00.000Z”}}}。请注意,翻译后的内容保持原意,易于理解,且不包含任何其他信息。 - java25
1
查询.query.addCriteria(Criteria.where("dob").gte(startDate).lt(endDate));在我的情况下没有起作用。我应该使用什么来在数据库中查找dob对象,例如: "dob" : ISODate("1991-01-22T18:30:00Z"), - Deepak Agrawal
1
@java25 那你怎么修复它? - JaskeyLam

16

1
如何在特定字段上添加where条件?例如,我想要AnyObject.company="flipkart"。如果您能提供Spring Data的签名,那就太好了。 - Sumanth Varada
2
@Query("{'date': {$gte: ?0, $lte: ?1}, 'company': ?2}" and method public List<AnyYourObj> findByDateBetweenAndCompany(Date from, Date to, String company); - S.Daineko

12

参考链接

Query query = new Query(
  Criteria.where("ip").is(ip)
  .andOperator(
    Criteria.where("createdDate").lt(endDate),
    Criteria.where("createdDate").gte(startDate)
  )
);

7

我需要在 publishedDate 字段上找到一些日期,以下是我的做法:

    Criteria publishedDateCriteria = Criteria
                        .where("publishedDateObject").gte(psDate)
                        .lte(peDate);
    Query query = new Query(publishedDateCriteria);
    mongoTemplate.find(query,
                        MyDocumentObject.class));

1
谢谢你,詹姆斯。这真的很有帮助。 - Chetan S. Choudhary
@user3327951,很高兴知道这个消息。:) 谢谢。 - James Jithin

5

我是这样做的

public interface PolicyRepository extends MongoRepository<Policy, String> {
    @Query("{'lastDate':{$gt:?0,$lt:?1}}")
        public List<Policy> findAllPolicies(Date today,Date somedate);
}

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"。


4

它可以工作,这里是一些示例代码:

Criteria criteria = Criteria.where("pt").gte(startDate)
       .andOperator(Criteria.where("pt").lt(endDate));

我正在尝试搜索出生日期(dob)的内容,但是我找不到任何用户。虽然数据库中有200个用户。 criteria = Criteria.where("dob").lt(startDate.getTime()).gte(endDate.getTime()); - Deepak Agrawal

3

2

使用MongoRepository查询方法,可以像这样:

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

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

类似的问题


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()));
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接