MongoDB에서 컬렉션에 저장된 마지막 N개의 레코드(문서)를 가져오려면 sort()와 limit() 메서드를 함께 사용하면 됩니다. 핵심은 $natural 연산자에 -1>을 지정하여 문서가 삽입된 순서의 역순으로 정렬한 뒤, 원하는 개수만큼 결과를 제한하는 것입니다.
기본 문법
마지막 N개의 레코드를 조회하는 기본 문법은 다음과 같습니다.
db.yourCollectionName.find().sort({$natural:-1}).limit(yourValue);
sort({$natural:-1}): 자연 순서(natural order)의 역순, 즉 가장 나중에 삽입된 문서부터 정렬합니다.limit(yourValue): 반환할 문서의 최대 개수를 지정합니다.
예제용 컬렉션 생성하기
실제 동작을 이해하기 위해 샘플 데이터가 담긴 컬렉션을 먼저 만들어 보겠습니다. 아래 쿼리는 직원 이름이 포함된 문서들을 하나씩 삽입합니다.
> db.getLastNRecordsDemo.insertOne({"EmployeeName":"Maxwell"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c6ecf3d6fd07954a4890689")
}
> db.getLastNRecordsDemo.insertOne({"EmployeeName":"Carol"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c6ecf496fd07954a489068a")
}
> db.getLastNRecordsDemo.insertOne({"EmployeeName":"Bob"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c6ecf4e6fd07954a489068b")
}
> db.getLastNRecordsDemo.insertOne({"EmployeeName":"Sam"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c6ecf546fd07954a489068c")
}
> db.getLastNRecordsDemo.insertOne({"EmployeeName":"Robert"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c6ecf596fd07954a489068d")
}
> db.getLastNRecordsDemo.insertOne({"EmployeeName":"Mike"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c6ecf606fd07954a489068e")
}
> db.getLastNRecordsDemo.insertOne({"EmployeeName":"Chris"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c6ecf686fd07954a489068f")
}
> db.getLastNRecordsDemo.insertOne({"EmployeeName":"James"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c6ecf6f6fd07954a4890690")
}
> db.getLastNRecordsDemo.insertOne({"EmployeeName":"Jace"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c6ecf756fd07954a4890691")
}
> db.getLastNRecordsDemo.insertOne({"EmployeeName":"Ramit"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c6ecf7d6fd07954a4890692")
}
> db.getLastNRecordsDemo.insertOne({"EmployeeName":"David"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c6ecf8d6fd07954a4890693")
}
위 과정을 통해 총 11개의 문서가 getLastNRecordsDemo 컬렉션에 순서대로 삽입되었습니다.
저장된 전체 문서 확인하기
find() 메서드를 사용하면 컬렉션의 모든 문서를 확인할 수 있습니다. pretty()를 붙이면 결과가 보기 좋게 정렬되어 출력됩니다.
> db.getLastNRecordsDemo.find().pretty();
실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5c6ecf3d6fd07954a4890689"), "EmployeeName" : "Maxwell" }
{ "_id" : ObjectId("5c6ecf496fd07954a489068a"), "EmployeeName" : "Carol" }
{ "_id" : ObjectId("5c6ecf4e6fd07954a489068b"), "EmployeeName" : "Bob" }
{ "_id" : ObjectId("5c6ecf546fd07954a489068c"), "EmployeeName" : "Sam" }
{ "_id" : ObjectId("5c6ecf596fd07954a489068d"), "EmployeeName" : "Robert" }
{ "_id" : ObjectId("5c6ecf606fd07954a489068e"), "EmployeeName" : "Mike" }
{ "_id" : ObjectId("5c6ecf686fd07954a489068f"), "EmployeeName" : "Chris" }
{ "_id" : ObjectId("5c6ecf6f6fd07954a4890690"), "EmployeeName" : "James" }
{ "_id" : ObjectId("5c6ecf756fd07954a4890691"), "EmployeeName" : "Jace" }
{ "_id" : ObjectId("5c6ecf7d6fd07954a4890692"), "EmployeeName" : "Ramit" }
{ "_id" : ObjectId("5c6ecf8d6fd07954a4890693"), "EmployeeName" : "David" }
삽입된 순서대로 Maxwell부터 David까지 출력되는 것을 확인할 수 있습니다.
마지막 N개 레코드 조회하기
이제 $natural:-1 정렬과 limit()을 조합하여 마지막 7개의 레코드를 조회해 보겠습니다.
> db.getLastNRecordsDemo.find().sort({$natural:-1}).limit(7);
실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5c6ecf8d6fd07954a4890693"), "EmployeeName" : "David" }
{ "_id" : ObjectId("5c6ecf7d6fd07954a4890692"), "EmployeeName" : "Ramit" }
{ "_id" : ObjectId("5c6ecf756fd07954a4890691"), "EmployeeName" : "Jace" }
{ "_id" : ObjectId("5c6ecf6f6fd07954a4890690"), "EmployeeName" : "James" }
{ "_id" : ObjectId("5c6ecf686fd07954a489068f"), "EmployeeName" : "Chris" }
{ "_id" : ObjectId("5c6ecf606fd07954a489068e"), "EmployeeName" : "Mike" }
{ "_id" : ObjectId("5c6ecf596fd07954a489068d"), "EmployeeName" : "Robert" }
결과를 보면 가장 마지막에 삽입된 David부터 시작해서 Robert까지, 즉 뒤에서 7번째 문서까지 역순으로 반환된 것을 알 수 있습니다.
참고 사항
$natural:-1은 디스크에 저장된 물리적 순서의 역방향을 의미하므로, 별도의 인덱스 없이도 삽입 순서 기준의 역순 조회가 가능합니다.- 특정 필드(예: 생성 시각
createdAt)를 기준으로 최신 데이터를 조회하려면sort({_id:-1})또는sort({createdAt:-1})처럼 해당 필드로 정렬하는 것이 더 안정적입니다. ObjectId에는 타임스탬프 정보가 포함되어 있어 대체적으로 시간순 정렬에 활용할 수 있습니다. - 대량의 데이터를 다룰 때는 정렬 기준 필드에 인덱스를 생성하면 성능을 크게 향상시킬 수 있습니다.