Java / MongoDB запрос по дате - PullRequest
35 голосов
/ 27 июля 2011

Я сохранил значение как 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 2011 и Wed Jul 27 16:54:49 EST 2011 (в основном fromDate = toDate),Я получаю объекты с датами типа Tue Jul 26 09:43:37 EST 2011, что определенно не должно быть возможным.Что мне здесь не хватает?

Ответы [ 4 ]

49 голосов
/ 27 июля 2011

То, что вы делаете, это запрос только с оператором {$lte: toDate} потерять $gte в перезаписи ключа. То, что вы хотите:

query.put("dateAdded", BasicDBObjectBuilder.start("$gte", fromDate).add("$lte", toDate).get());
3 голосов
/ 12 мая 2015

Поиск даты в определенном формате. Следующие шаги показывают, что это также работает в Монго 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.

3 голосов
/ 05 мая 2015

Использование клиента 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) );
3 голосов
/ 28 апреля 2015

Если вы используете MongoTemplate из Spring-Data Mongodb, вы можете сделать то же самое следующим образом: -

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