2014-01-24 2 views
0

나는 지금 내가 좋아하는 STH, 초 하루의 마지막 분으로, 하루의 첫 번째 분의 범위 을 사용 할 때까지 특정 일에 작성된 문서를 찾으려면 :범위를 사용하지 않는 MongoDb Date 쿼리?

query":{"dtCreated":{"$gte":{"sec":1381356782,"usec":0},"$lt":{"sec":1389356782,"usec":0}}} 

일, 월 및 연도 만 "dtCreated"인 모든 문서를 어떻게 든 찾을 수 있습니까? 같은 의사의

:

query:{"dtCreated":ISODate("2014-01-23")} <- i know that may not be a valid iso date 

는하지만 내가 원하는 것은 LT하고있다을 사용하지 않고 하루 동안 모든 문서를 찾을 수 있습니다?

Sry, 영어 불만, 다른 힌트를 미리 감사드립니다!

답변

1

date aggregation operators을 사용하는 집계 프레임 워크로 수행 할 수 있습니다. ISODate 필드,이 같은 시도 할 수있다 dtCreated 가정 :

query = [ 
    { 
     '$project': { 
      'year': {'$year':'$dtCreated'}, 
      'month': {'$month':'$dtCreated'}, 
      'day':{'$dayOfMonth':'$dtCreated'} 
     } 
    }, 
    { 
     '$match' : {'year':'2014', 'month':'1', day:'1'} 
    } 
] 

db.mycollection.aggregate(query) 

편집가 : orid 바르게 발언으로이 대답은 (날짜 범위를 사용하지 않고 날짜에 대한 쿼리) 귀하의 질문에 비록, 그것의를 문제를 해결할 좋은 방법이 아닙니다. 나는 아마 이렇게 할 것입니다 : 오늘보다 크거나 같은 범위, 내일보다는 작음

db.foo.find({'dtCreated':{'$gte':ISODate("2014-01-23"), '$lt':ISODate("2014-01-24")}}) 
+0

멋진 작품은 제가 찾고있는 것입니다! ! ! 고마워요. –

+0

@johnSmith 위의 코드는 정상적으로 작동하지만 무해한 것은 아닙니다. '$ project'를 먼저 사용하기 때문에, 당신은 실제로 하루를 매치하고 싶지만, 콜렉션의 어떤 문서도 필터링하지 않습니다. 둘째,'$ match'는 dtCreated 인덱스가 존재한다면 그것을 사용할 수 없다. 컬렉션에서 바로 데이터를 사용하지 않기 때문이다. 접근 방식에는 아무런 문제가 없습니다 ('$ gt' 및'$ lt' 쿼리). 만약 당신이 주장한다면, 당신은 그 값이 –

+0

의 날인 평등을위한 추가 필드를 추가 할 수 있습니다. 아쉽게도 날짜 연산자는 집계 프레임 워크 외부에서 사용할 수 없습니다. – Mzzl

관련 문제