2010-02-18 11 views
3

웹 서비스에서 일부 통계를 수집하여 컬렉션에 저장하고 있습니다. 데이터는 (하지만 더 필드)이 유사하게 나타납니다

사람이 지난 30 일 동안 매일 번호를 요청하는 경우
{"downloads": 30, "dt": "2010-02-17T16:56:34.163000"} 
{"downloads": 30, "dt": "2010-02-17T17:56:34.163000"} 
{"downloads": 30, "dt": "2010-02-17T18:56:34.163000"} 
{"downloads": 30, "dt": "2010-02-17T19:56:34.163000"} 
{"downloads": 30, "dt": "2010-02-17T20:56:34.163000"} 
{…} 
{"downloads": 30, "dt": "2010-02-18T17:56:34.163000"} 
{"downloads": 30, "dt": "2010-02-18T18:56:34.163000"} 
{"downloads": 30, "dt": "2010-02-18T19:56:34.163000"} 
{"downloads": 30, "dt": "2010-02-18T20:56:34.163000"} 

, 즉 '다운로드'홍보 (이 예에서는)의 최대 금액을 의미한다. 일. 오늘의 마지막 기록은 어느 것입니까?

collection.find({"dt": {"$gt": datetime_obj_30_days_ago}})을 사용하면 당연히 모든 행을 얻습니다. 이는별로 적합하지 않습니다. 따라서 주어진 기간 동안 마지막 날만 반환하는 방법을 찾고 있습니다.

나는 group()이 될 수 있다고 들었지만,이 인스턴스에서 작동시키는 방법을 이해할 수 없다.

팁, 포인터는 매우 감사하겠습니다!

답변

1

group을 사용하면됩니다. 귀하의 예제에서 datetime 필드의 날짜 구성 요소 만 원하기 때문에 키를 계산하는 데 javascript 함수 (reduce 함수는 물론)를 제공해야합니다. 그래야만 작동합니다.

db.coll.group(
    key='function(doc) { return {"dt": doc.dt.toDateString()} }', 
    condition={'dt': {'$gt': datetime_obj_30_days_ago}}, 
    initial={'downloads': 0}, 
    reduce='function(curr, prev) { prev.downloads = Math.max(curr.downloads, prev.downloads) }' 
) 

지난 달의 선형 스캔은 클라이언트 대신 서버에서 계속 수행됩니다. 가능 단순히 매일 개별적으로 최대 값을 개별적으로 선택하는 것이 더 빠릅니다.

+0

감사합니다. Coady - 방금 '그룹'에 대한 나의 이해를 넓혔습니다. :-) –