MongoDB $natural 정렬이란?
MongoDB의 $natural 연산자는 컬렉션에 문서가 저장된 자연 순서(natural order), 즉 삽입 순서를 기준으로 조회 결과를 정렬할 때 사용합니다. 지정하는 값에 따라 동작이 달라집니다.
- {$natural: 1} — 문서를 삽입된 순서 그대로 반환합니다.
- {$natural: -1} — 문서를 역순으로 반환합니다. LIFO(Last In First Out) 방식처럼 작동하므로, 가장 마지막에 삽입된 문서가 가장 먼저 조회됩니다.
아래 예제를 통해 실제 동작을 단계별로 확인해 보겠습니다.
1. 샘플 컬렉션 생성 및 문서 삽입
먼저 demo614 컬렉션을 만들고 국가 이름 문서를 차례로 삽입합니다.
> db.demo614.insertOne({"CountryName":"US"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e988cddf6b89257f5584d8e")
}
> db.demo614.insertOne({"CountryName":"UK"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e988ce0f6b89257f5584d8f")
}
> db.demo614.insertOne({"CountryName":"AUS"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e988ce3f6b89257f5584d90")
}
> db.demo614.insertOne({"CountryName":"IND"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e988cebf6b89257f5584d91")
}2. find()로 전체 문서 조회하기
find() 메서드를 사용해 컬렉션의 모든 문서를 조회합니다.
> db.demo614.find();
실행 결과는 다음과 같습니다. 별도의 정렬 조건이 없기 때문에 문서가 삽입된 순서 그대로 출력됩니다.
{ "_id" : ObjectId("5e988cddf6b89257f5584d8e"), "CountryName" : "US" }
{ "_id" : ObjectId("5e988ce0f6b89257f5584d8f"), "CountryName" : "UK" }
{ "_id" : ObjectId("5e988ce3f6b89257f5584d90"), "CountryName" : "AUS" }
{ "_id" : ObjectId("5e988cebf6b89257f5584d91"), "CountryName" : "IND" }3. sort({$natural: -1})로 역순 조회하기
이번에는 $natural 값에 -1을 지정해 문서를 역순으로 정렬해 보겠습니다.
> db.demo614.find().sort({$natural:-1})실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e988cebf6b89257f5584d91"), "CountryName" : "IND" }
{ "_id" : ObjectId("5e988ce3f6b89257f5584d90"), "CountryName" : "AUS" }
{ "_id" : ObjectId("5e988ce0f6b89257f5584d8f"), "CountryName" : "UK" }
{ "_id" : ObjectId("5e988cddf6b89257f5584d8e"), "CountryName" : "US" }앞선 결과와 비교하면 출력 순서가 완전히 뒤바뀐 것을 확인할 수 있습니다. 가장 나중에 삽입된 IND 문서가 첫 번째로, 가장 먼저 삽입된 US 문서가 마지막으로 표시됩니다.
정리 및 활용 팁
- $natural 정렬은 별도의 인덱스 없이도 사용할 수 있어, 최근에 삽입된 데이터를 빠르게 확인할 때 유용합니다.
- 다만 일반 컬렉션에서 자연 순서는 스토리지 엔진의 내부 동작에 따라 달라질 수 있으므로, 엄격한 순서 보장이 필요하다면 타임스탬프 필드나 ObjectId 기준 정렬을 함께 고려하는 것이 좋습니다.