按日期查询Java/MongoDB

Gui*_*ume 35 java datetime mongodb

我将一个值存储为我的集合中的java.util.Date(),但是当我查询获取两个特定日期之间的值时,我最终得到的值超出了该范围.这是我的代码:

插入

BasicDBObject object = new BasicDBObject();
...
object.put("dateAdded", new java.util.Date());
collection.insert(object);
Run Code Online (Sandbox Code Playgroud)

查询

BasicDBObject query = new BasicDBObject();
query.put("dateAdded", new BasicDBObject("$gte", fromDate));
query.put("dateAdded", new BasicDBObject("$lte", toDate));
collection.find(query).sort(new BasicDBObject("dateAdded", -1));
Run Code Online (Sandbox Code Playgroud)

当我在Wed Jul 27 16:54:49 EST 2011和之间查询Wed Jul 27 16:54:49 EST 2011(基本上是fromDate = toDate)时,我得到的日期对应的对象Tue Jul 26 09:43:37 EST 2011绝对不可能.我在这里错过了什么?

pin*_*33n 49

你正在做的是只在密钥覆盖中{$lte: toDate}丢失$gte操作符进行查询.你想要的是:

query.put("dateAdded", BasicDBObjectBuilder.start("$gte", fromDate).add("$lte", toDate).get());
Run Code Online (Sandbox Code Playgroud)

  • 令人惊讶的是很难找到这个问题的答案. (3认同)

Vai*_*hav 6

如果您使用 Spring-Data Mongodb 的 MongoTemplate,您可以按以下方式执行相同操作:-

public List<Link> getLinksBetweenDate(Date startDate, Date endDate) {
            Query query = new Query().addCriteria(Criteria.where("updatedOn").gt(startDate).lte(endDate));
            return mongoTemplate.find(query, Link.class);
        }
Run Code Online (Sandbox Code Playgroud)


小智 5

使用 mongo 客户端 3.0

DateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.ENGLISH);
Bson filter = new Document("$gte", format.parse("2015-05-01T00:00:00Z")).append("$lt", format.parse("2015-05-02T00:00:00Z"));
long count = db.getCollection("colection").count(new Document("field",filter) );
Run Code Online (Sandbox Code Playgroud)