2012-12-28 1 views
1

서버 쪽 문서에서 두 날짜 간의 차이를 계산하고 쿼리 할 수 ​​있습니까?각 문서의 ISODate의 차이점은 무엇입니까?

>>> db.collection.find() 
[ 
    { "id" : ObjectId("1"), 
     "starttime" : ISODate("2011-12-01T05:01:00"), # 5:01 AM 
     "endtime" : ISODate("2011-12-01T05:02:00") # 5:02 AM 
    }, 

    { "id" : ObjectId("2"), 
     "starttime" : ISODate("2011-12-01T06:01:00"), # 6:01:00 AM 
     "endtime" : ISODate("2011-12-01T06:01:30") # 6:01:30 AM 
    } 
] 

이 비슷한을 달성 할 수있는 방법이 있나요 : (같이 SQL의 DATEDIFF 기능)

내가이 같은 문서의 번호를 가지고 가정?

>>> db.collection.date_difference_seconds(endtime, starttime) 
[60, 30] 

또는 쿼리 :

단지 시간 차이를 반환은

>>> db.collection.find("timediff(endtime-starttime) < 40 seconds") 
[ 
    { "id" : ObjectId("2"), ...} # Just second document (30s diff) 
] 

나는 약 server-side JSeval() 읽었습니다,하지만 문서는 이러한 권장하지 않습니다 말한다 - 그들은 최선의 선택이다 ?


를 (I 분명히 추가 필드 ( "time_diff": 30)로 초 단위의 시간 차이를 추가하거나 파이썬 클라이언트 측의 차이를 계산하지만, 나는 그것이 가능한 서버 측 있는지 알고 싶습니다 수 있습니다)

클라이언트 측 CALC는 :

Sammaye에 의해 제안
>>> for doc in (collection.find(None, {'starttime': 1, 'endtime': 1 })) 
     doc['endtime']-doc['startime'] 
0:01:00.000000 
0:00:30.000000 
+0

나는 이것을하기 위해 당신이 질문하고 싶은 시간차를 알아야한다고 생각하니? 그렇다면 다른 날짜로 쿼리하고 클라이언트 측의 차이점을 계산하지 않는 이유는 무엇입니까? – Sammaye

+0

@Sammaye 나는 잘 모르겠다. 나는 날짜 들간의 차이에만 관심이 있고, 날짜 자체에는 관심이 없다. 내 질문에 추가 한 스 니펫과 같은 것을 의미합니까? –

+0

서버 측에서 특별한 방법이 있다고는 생각하지 않지만 클라이언트 쪽에서는 하나의 명령문으로 수행 할 수 있습니다. map (lambda x : (x [ 'endtime'] - x [ 'starttime']). total_seconds(), db.collection.find()) –

답변

3

, 나는 그것이 집계() 함수를 함께 할 수있는 유일한 방법을 생각한다. 당신은 본질적으로 기존 데이터의 오프 계산, "timediff"새로운 런타임 필드를 정의하고

db.collection.aggregate([{$project: {timediff: {$subtract: ['$endtime' , '$starttime']}}}]) 

예를 들어, 같은 일을하고. 누락 된 중괄호 또는 대괄호 몇 ... 그러나 희망을있을 수 있습니다 그래서이 구체적인 예를 시도하지 않은

db.collection.aggregate([{$project: {timediff: {$subtract: ['$endtime' , '$starttime']}}}, {$match: {timediff: {$lte: 40}}}]) 

: 당신은 다음의 차이에 필터링 파이프 라인에 $match 단계를 추가 할 수 있어야 아이디어를 얻으십시오. 집계 프레임 워크는 정의 할 수있는 데이터 파이프 라인 측면에서 매우 강력합니다.

행운을 빈다.

+1

그것에 대해 단지 의견. $ lte : 40은 40 초가 아닙니다. 적어도 현재 현재 사용하고있는 mongodb 버전은 밀리 초를 반환합니다. 40 초 차이를 얻으려면 $ lte : 40000이어야합니다. –

관련 문제