MongoDB에서 자연 순서(natural order)로 정렬하기
MongoDB에서 문서를 자연 순서대로 정렬하려면 $natural 연산자를 사용하면 됩니다. $natural은 컬렉션에 문서가 저장된 물리적 순서, 즉 디스크에 기록된 순서를 기준으로 결과를 반환합니다. 일반적으로 이는 ObjectId의 생성 순서와도 일치합니다.
먼저 예제에 사용할 컬렉션을 만들고 문서를 삽입해 보겠습니다.
> db.demo684.insertOne({Value:10});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ea530cea7e81adc6a0b3957")
}
> db.demo684.insertOne({Value:50});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ea530d1a7e81adc6a0b3958")
}
> db.demo684.insertOne({Value:60});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ea530d4a7e81adc6a0b3959")
}
> db.demo684.insertOne({Value:40});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ea530d8a7e81adc6a0b395a")
}find() 메서드로 전체 문서 조회
find() 메서드를 사용하면 컬렉션의 모든 문서를 확인할 수 있습니다.
> db.demo684.find();
위 쿼리는 다음과 같은 결과를 출력합니다.
{ "_id" : ObjectId("5ea530cea7e81adc6a0b3957"), "Value" : 10 }
{ "_id" : ObjectId("5ea530d1a7e81adc6a0b3958"), "Value" : 50 }
{ "_id" : ObjectId("5ea530d4a7e81adc6a0b3959"), "Value" : 60 }
{ "_id" : ObjectId("5ea530d8a7e81adc6a0b395a"), "Value" : 40 }_id 기준으로 정렬하기
다음은 _id 필드를 기준으로 오름차순 정렬하는 쿼리입니다.
> db.demo684.find().sort({'_id': 1});실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5ea530cea7e81adc6a0b3957"), "Value" : 10 }
{ "_id" : ObjectId("5ea530d1a7e81adc6a0b3958"), "Value" : 50 }
{ "_id" : ObjectId("5ea530d4a7e81adc6a0b3959"), "Value" : 60 }
{ "_id" : ObjectId("5ea530d8a7e81adc6a0b395a"), "Value" : 40 }$natural 연산자 사용하기
같은 결과는 $natural 연산자로도 얻을 수 있습니다. 값이 1이면 삽입 순서(오름차순), -1이면 역순(내림차순)으로 정렬됩니다.
> db.demo684.find().sort({$natural: 1});출력 결과는 다음과 같습니다.
{ "_id" : ObjectId("5ea530cea7e81adc6a0b3957"), "Value" : 10 }
{ "_id" : ObjectId("5ea530d1a7e81adc6a0b3958"), "Value" : 50 }
{ "_id" : ObjectId("5ea530d4a7e81adc6a0b3959"), "Value" : 60 }
{ "_id" : ObjectId("5ea530d8a7e81adc6a0b395a"), "Value" : 40 }이처럼 MongoDB에서 자연 순서 정렬이 필요할 때는 sort() 메서드에 {$natural: 1} 또는 {$natural: -1}을 지정하면 간단하게 처리할 수 있습니다. 다만 WiredTiger 스토리지 엔진에서는 $natural 정렬이 항상 삽입 순서를 보장하지 않으므로, 엄격한 시간순 정렬이 필요하다면 _id나 타임스탬프 필드를 기준으로 정렬하는 것이 더 안전합니다.