2014-03-25 6 views
0

컬렉션의 각 사용자에 대한 최신 문서를 컬렉션에서 가져와야합니다.각 사용자에 대한 최신 문서 가져 오기

[ 
    { user: "bob", time: ISODate("Mon, 26 Mar 2012 05:52:21 +0000"), value: "d" }, 
    { user: "joe", time: ISODate("Sun, 25 Mar 2012 05:52:21 +0000"), value: "e" } 
] 
내가 여기이 질문을보고

:

[ 
    { user: "bob", time: ISODate("Sat, 24 Mar 2012 05:52:21 +0000"), value: "a" }, 
    { user: "bob", time: ISODate("Sun, 25 Mar 2012 05:52:21 +0000"), value: "b" }, 
    { user: "joe", time: ISODate("Sat, 24 Mar 2012 05:52:21 +0000"), value: "c" }, 
    { user: "bob", time: ISODate("Mon, 26 Mar 2012 05:52:21 +0000"), value: "d" }, 
    { user: "joe", time: ISODate("Sun, 25 Mar 2012 05:52:21 +0000"), value: "e" } 
] 

가 조회 후, 나는이 항목을 다시 얻으려면 : 예를 들어, 나는 다음과 같은 데이터가 있다고 가정 할 수 있습니다 MongoDB Map-Reduce Find Values from Last Record per User하지만, 그렇지 않습니다 꽤 내가 찾는 바로 대답 인 것 같아. 이 데이터를 어떻게 쿼리합니까?

+0

시간이 실제로 서식이 지정되었거나 서식을 지정하기 위해 ISODate() 부분을 제거하는 것입니까? 실제 문자열이라면 문제가 생깁니다. –

+0

아니요, 실제로는 ISODate()입니다. 간단하게 씁니다. – kbjr

답변

2

당신은이 작업을 수행 할 .aggregate() 방법으로 $last 연산자를 사용할 수 있습니다 : 그래서 당신은 값을 반환 그룹화 경계에서 "마지막" 항목을 복용

db.collection.aggregate([ 
    { "$sort": { "user": 1, "time": 1 } }, 
    { "$group": { 
     "_id": "$user", 
     "time": { "$last": "$time" }, 
     "value": { "$last": "$value" } 
    }} 
]) 

. $last의 사용은 실제로 대부분의 경우에 정렬 이후에 의미가 있지만, 이와 같은 인서트를 늘리면 아마 제외 될 수 있습니다.

값이 항상 증가하므로 $sort의 타임 스탬프 대신 _id 값을 사용할 수도 있습니다.

관련 문제