2016-08-05 2 views
0

나는 내 응용 프로그램을 사용하여 각 사용자에 대한 일련의 데이터를 작성하고 있습니다.시리즈에서 마지막 삽입을 얻으십시오

문서 형식은 내가 ("userId를"로) 사용자의 목록 ("타임 스탬프"로) 데이터를 삽입 마지막으로 얻을 수있는 간단한 쿼리를 찾고 있어요

{ "userId": String, "timestamp": DateTime, "data": Data } 

을 따르고있다.

현재 구현을 참조하십시오.

userIds.forEach(function(id){ 
    db.data.find({"userId":id}).sort({"timestamp":-1}).limit(1); 
}); 
+0

이 쿼리의 결과로 1 개의 문서 또는 문서 집합을 가져오고 싶습니까? (각 'userId'에 대해 가장 오래된 'data')? – tarashypka

+0

'''userId''에 대해 하나의 문서가 필요합니다 – sestegra

답변

3

aggregation-framework을 사용하면이를 수행 할 수 있습니다. 문서

{ "userId" : "1", "timestamp" : 1470385420806, "data" : "123" } 
{ "userId" : "1", "timestamp" : 1470386440616, "data" : "456" } 
{ "userId" : "2", "timestamp" : 1470385598845, "data" : "222" } 
{ "userId" : "2", "timestamp" : 1470385602249, "data" : "333" } 

의 수집 timestamp 필드

db.yourCollection.aggregate( 
    { $group: { _id: "$userId", "last": { $max: "$timestamp" } } } 
); 

하나 개 $group 무대 $max 연산자 집계 파이프 라인은 당신이 기대하는 것 같다 결과

{ "_id" : "1", "last" : 1470386440616 } 
{ "_id" : "2", "last" : 1470385602249 } 

을 줄 것이다.

0

쿼리에 여러 사용자를 지정하고 타임 스탬프별로 정렬하고 하나만 반환 할 수 있습니다. 그냥 같이 :

db.users.find({userId: {$in:[your_list_ids]}}, {fields_you_need}).sort({timestamp: -1}).limit(1)

그래서,이 요청이 그룹에 (누구의 userId를 배열에 모두) 모든 사용자를 발견 한 후 "타임 스탬프"필드를 기준으로 내림차순으로 정렬 1 개 기록하여 출력을 제한합니다.

기억해! 정렬을 빠르게 유지하려면 정렬 된 필드에 인덱스를 적용해야합니다.

+0

4 ID를 요청하면 결과가 4 개가됩니다. – sestegra

관련 문제