我将一个值存储为我的集合中的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
的对象绝对不可能。我在这里缺少什么?
答案 0 :(得分:49)
您正在做的是仅在密钥覆盖中{$lte: toDate}
丢失$gte
运算符进行查询。你想要的是:
query.put("dateAdded", BasicDBObjectBuilder.start("$gte", fromDate).add("$lte", toDate).get());
答案 1 :(得分:3)
如果您正在使用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);
}
答案 2 :(得分:3)
使用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 :(得分:3)
以下步骤采用特定格式的搜索日期,这也适用于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
中提供参数来搜索日期。
答案 4 :(得分:1)
您可以
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")))
答案 5 :(得分:0)
我这样处理查询
new Document("datetime",Document.parse(
"{$gte: ISODate('" + new SimpleDateFormat("yyyy-MM-dd").format(fromDate) + "'),
$lte: ISODate('" + new SimpleDateFormat("yyyy-MM-dd").format(endDate) + "')}"
))