2014-02-06 5 views
0

mongodb 컬렉션에서 날짜가 문자열로 저장되었습니다.날짜 비교가있는 MongoDB 쿼리 찾기

지난 24 시간 내에 삽입 된 문서를 가져 오려고합니다. 아래는 내 코드입니다.

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
    Date yest = new Date(); 
    Date now = new Date(); 

    Calendar cal = Calendar.getInstance(); 
    cal.setTime(now); 
    cal.add(Calendar.MINUTE, -1440); 
    yest = cal.getTime(); 

    String dToN = sdf.format(now); 
    String dToY = sdf.format(yest); 
    System.out.println("Yest:"+dToY); 
    System.out.println("Now:"+dToN) 

    BasicDBObject find = new BasicDBObject("retryCount", new BasicDBObject("$gt", 0)); 
    find.append("status",1); 
    find.append("deliveryTime",new BasicDBObject("$gte", dToY)); 
    find.append("deliveryTime",new BasicDBObject("$lte", dToN)); 
    cursor = coll.find(find); 
    int misCount = cursor.count(); 

그러나 내 날짜 비교 코드가 작동하지 않습니다. 매번 0이됩니다. 이 코드의 잘못된 점은 무엇입니까?

+0

주어진 답이 문제를 해결해야합니다. 나는 이것이 왜 주석인지에 대한 설명을 덧붙였다. –

답변

0

업데이트 날짜 비교 코드는 다음과 같이 문제가 컬렉션의 문서가 실제로 deliveryTime 분야에서 문자열을해야한다는 것입니다 대화 체인에서 그래서

DBObject dateQuery = BasicDBObjectBuilder.start("$gte", yest).add("$lte", now).get(); 
find.put("deliveryTime", dateQuery); 
+0

이 응답을 설명합니다. 실제로는 문자열이 아닌 Date 객체 (표시된대로 수정 됨)를 전달하려고합니다. mongo 셸에서 날짜는 문자열처럼 보일 수 있지만 실제로는 내부적으로 * epoch * 시간의 숫자입니다. 운전자가 적절하게 전환을 처리하고 있습니다. –

+0

@ NeeLunn 변경 사항을 완료했지만 여전히 0이됩니다. – Sidd

+0

@Sidd IDE를 여는 동안. mongo 쉘에서 아무것도 리턴하지 않을 때 볼 수있는 값으로 조회를 테스트 할 수 있습니까? 또한 System.out 디버깅이 예상 한 날짜를 제공했는지 확인하십시오. –

0

. 삽입 및 업데이트 코드가 유사한 전환을 수행하는 경우 여러 위치에서이 작업을 수행 할 수 있습니다. 또한 내부 형식은 UTC이며 이는 아마도 문자열이 아닌 것입니다. 운전 기사가이 문제를 처리하도록되어 있습니다.

컬렉션에서 날짜를 변환하고 쓰거나 읽는 모든 영역을 문자열로 보는 것이 좋습니다.

다음은 날짜 객체를 사용하는 방법과 그들이 직렬화하는 방법을 보여줍니다 :

Date now = new Date(); 
    Calendar cal = Calendar.getInstance(); 
    cal.setTime(now); 
    cal.add(Calendar.DAY_OF_MONTH, -1); 
    Date yest = cal.getTime(); 

    BasicDBObject timeNow = new BasicDBObject("now", now); 
    BasicDBObject timeThen = new BasicDBObject("then" yest) 
    System.out.println(timeNow); 
    System.out.println(timeThen); 

참고 : 아래와 같은 출력이 표시 비록. 여전히 문자열을 전달하지는 않지만, BSON 타임 스탬프 유형의 에포크 타임 스탬프입니다.

{ "this" : { "$date" : "2014-02-06T10:50:05.873Z"}} 
+0

컬렉션에 문서를 삽입 할 때 포맷을 변경해야한다는 것을 의미합니다. 그리고 당신에 따르면, 날짜가 문자열로 삽입 된 경우 비교할 방법이 없습니다. 권리 ? – Sidd

+0

조언을받을 것입니다. 본질적으로 당신은 당신의 인라인 코드에서 무거운 물건을 들어 올리고, 변환하고 파싱하는 모든 일을하고 있습니다. 그것은 시간대 변환 등을하는 것을 포함합니다. 미래의 서버 측에서 수행 될 수있는 모든 날짜 계산을 위해 발에서 자신을 쏘고 있습니다. 대안은 결과와 동기화 된 문자열 형식과 시간대를 가져 오는 것이며 어쩌면 모든 것이 어휘 순서 ** **로 이루어지며 아무도 다르게 처리하지 않을 것입니다. 미래 통증을 해결하기위한 통증이 있습니다. –