2011-07-27 43 views
34

Tôi đã lưu trữ giá trị dưới dạng java.util.Date() trong bộ sưu tập của mình, nhưng khi tôi truy vấn để nhận giá trị giữa hai ngày cụ thể, tôi sẽ nhận được các giá trị ngoài phạm vi. Dưới đây là mã của tôi:Truy vấn Java/MongoDB theo ngày

để chèn

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

để truy vấn

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

khi tôi truy vấn giữa Wed Jul 27 16:54:49 EST 2011Wed Jul 27 16:54:49 EST 2011 (về cơ bản FROMNgày = NHCTVN), tôi nhận được đối tượng với số ngày như Tue Jul 26 09:43:37 EST 2011 mà nên chắc chắn không thể. Tôi đang thiếu gì ở đây?

Trả lời

47

Việc bạn đang làm là chỉ truy vấn với {$lte: toDate} mất nhà cung cấp $gte trong ghi đè khóa. Những gì bạn muốn là:

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

Mẹo tuyệt vời! Vì vậy, về cơ bản mỗi khi tôi muốn truy vấn trên cùng một lĩnh vực với các tiêu chí khác nhau tôi phải sử dụng quyền xây dựng? tốt để biết! Bạn tìm thấy cái này ở đâu? có bất kỳ tài liệu nào mà tôi không biết? (vì hướng dẫn java chính thức của Mongodb khá nghèo!) – Guillaume

+1

@Guillaume Không chính xác. Bạn cũng có thể tạo và điền 'BasicDBObject', trình xây dựng chỉ là trình trợ giúp cho phép thực hiện nó trong một chế độ an toàn duy nhất. Vấn đề là 'DBObject' (giống như tất cả 'Map' trong Java) chỉ có thể chứa các khóa duy nhất. Và bạn mất giá trị trước đó khi đặt giá trị mới bằng cùng một khóa. Ngoài ra, hướng dẫn chính thức cũng có ví dụ về cách sử dụng nhiều toán tử trên cùng một lĩnh vực: http://www.mongodb.org/display/DOCS/Java+Tutorial#JavaTutorial-GettingASetofDocumentsWithaQuery – pingw33n

+3

Đáng ngạc nhiên khi tìm câu trả lời cho câu hỏi đó. –

1

Nếu bạn đang sử dụng MongoTemplate của mùa xuân-Data MongoDB, bạn có thể làm tương tự theo cách sau đây: -

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

Sử dụng 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)); 
+0

Số tiền dài sẽ trả về? Những gì được chứa trong biến này? Làm thế nào để bạn trích xuất các mục cơ sở dữ liệu từ biến này? – user3388925

2

Ngày tìm kiếm với định dạng cụ thể theo các bước là điều này cũng hoạt động ở mongo 3.0

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

Đầu tiên chuyển đổi ngày của bạn theo định dạng cụ thể của bạn, bạn có thể sử dụng bất kỳ định dạng nào và phân tích cú pháp ngày của bạn với định dạng trên và sau đó chuyển vào truy vấn.

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

Vì vậy, căn cứ vào yêu cầu của bạn, bạn có thể cập nhật tìm kiếm bằng cách đưa ra tranh luận trong BasicDBobject.

Các vấn đề liên quan