Java/MongoDB按日期查询



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

插入
BasicDBObject object = new BasicDBObject();
...
object.put("dateAdded", new java.util.Date());
collection.insert(object);
查询

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

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

您正在做的是只查询{$lte: toDate}丢失$gte操作符在键覆盖。你想要的是:

query.put("dateAdded", BasicDBObjectBuilder.start("$gte", fromDate).add("$lte", toDate).get());

如果您使用的是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);
        }

使用mongo client 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) );

搜索日期的具体格式如下步骤,这也适用于mongo 3.0

SimpleDateFormat simpleDateFormat = new SimpleDateFormat ("yyyy.MM.dd");

首先将您的日期转换为您的特定格式,您可以使用任何格式并使用上述格式解析您的日期,然后传入查询。

String date ="2014.01.02"; 
String data1 ="2014.01.10";
Date startDate = simpleDateFormat.parse(date);  
Date endDate = simpleDateFormat.parse(date1);
BasicDBObject query = new BasicDBObject("fieldName",
   new BasicDBObject("$gte",startDate).append("$lt",endDate ));

因此,根据您的要求,您可以通过在BasicDBobject中给出参数来搜索日期。

你可以做

    import org.bson.conversions.Bson;
    import static com.mongodb.client.model.Filters.*;
    import java.text.SimpleDateFormat;
    DateFormat format = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH);
    Bson filter = Filters.and(gte("date_field", format.parse("2018-10-01")),
                            lt("date_field", format.parse("2019-10-01")))

我这样处理查询

new Document("datetime",Document.parse(
    "{$gte: ISODate('" + new SimpleDateFormat("yyyy-MM-dd").format(fromDate) + "'), 
     $lte: ISODate('" + new SimpleDateFormat("yyyy-MM-dd").format(endDate) + "')}"
))

如果在应用日期范围时想要精确的答案做更多的事情,请使用UTC时间。

在您的本地机器上,您可以使用以下代码从您的机器或服务器中查找UTC时间:

java.util.TimeZone.setDefault(java.util.TimeZone.getTimeZone("UTC"));

相关内容

  • 没有找到相关文章