MongoDB에서 문자열에 포함된 숫자를 기준으로 정렬하려면 numericOrdering: true 옵션을 설정해야 합니다. 기본 정렬 방식은 사전 순(lexicographic)으로 문자열을 비교하기 때문에 "STU1010"이 "STU908"보다 앞에 오는 등 의도와 다른 결과가 나올 수 있습니다. collation의 numericOrdering 옵션을 사용하면 숫자 부분을 실제 숫자 값으로 인식해 자연스러운 순서로 정렬할 수 있습니다.
먼저 컬렉션을 생성하고 문서를 삽입해 보겠습니다.
> db.alphanumericSortDemo.insertOne({"StudentId":"STU1010"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ccf149adceb9a92e6aa194c")
}
> db.alphanumericSortDemo.insertOne({"StudentId":"STU1101"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ccf14a2dceb9a92e6aa194d")
}
> db.alphanumericSortDemo.insertOne({"StudentId":"STU1901"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ccf14a9dceb9a92e6aa194e")
}
> db.alphanumericSortDemo.insertOne({"StudentId":"STU908"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ccf14aedceb9a92e6aa194f")
}
> db.alphanumericSortDemo.insertOne({"StudentId":"STU101"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ccf14b2dceb9a92e6aa1950")
}다음은 find() 메서드를 사용해 컬렉션의 모든 문서를 조회하는 쿼리입니다.
> db.alphanumericSortDemo.find().pretty();
위 쿼리를 실행하면 다음과 같은 출력 결과를 확인할 수 있습니다.
{ "_id" : ObjectId("5ccf149adceb9a92e6aa194c"), "StudentId" : "STU1010" }
{ "_id" : ObjectId("5ccf14a2dceb9a92e6aa194d"), "StudentId" : "STU1101" }
{ "_id" : ObjectId("5ccf14a9dceb9a92e6aa194e"), "StudentId" : "STU1901" }
{ "_id" : ObjectId("5ccf14aedceb9a92e6aa194f"), "StudentId" : "STU908" }
{ "_id" : ObjectId("5ccf14b2dceb9a92e6aa1950"), "StudentId" : "STU101" }사례 1: 오름차순 정렬
결과를 오름차순으로 정렬하고 싶다면 sort 값에 1을 지정합니다.
MongoDB에서 영숫자 정렬을 수행하는 쿼리는 다음과 같습니다.
> db.alphanumericSortDemo.find({}).sort({"StudentId" : 1}).collation( { locale: "en_US", numericOrdering: true });실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5ccf14b2dceb9a92e6aa1950"), "StudentId" : "STU101" }
{ "_id" : ObjectId("5ccf14aedceb9a92e6aa194f"), "StudentId" : "STU908" }
{ "_id" : ObjectId("5ccf149adceb9a92e6aa194c"), "StudentId" : "STU1010" }
{ "_id" : ObjectId("5ccf14a2dceb9a92e6aa194d"), "StudentId" : "STU1101" }
{ "_id" : ObjectId("5ccf14a9dceb9a92e6aa194e"), "StudentId" : "STU1901" }사례 2: 내림차순 정렬
결과를 내림차순으로 정렬하고 싶다면 sort 값에 -1을 지정합니다.
MongoDB에서 영숫자 정렬을 수행하는 쿼리는 다음과 같습니다.
> db.alphanumericSortDemo.find({}).sort({"StudentId" : -1}).collation( { locale: "en_US", numericOrdering: true });실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5ccf14a9dceb9a92e6aa194e"), "StudentId" : "STU1901" }
{ "_id" : ObjectId("5ccf14a2dceb9a92e6aa194d"), "StudentId" : "STU1101" }
{ "_id" : ObjectId("5ccf149adceb9a92e6aa194c"), "StudentId" : "STU1010" }
{ "_id" : ObjectId("5ccf14aedceb9a92e6aa194f"), "StudentId" : "STU908" }
{ "_id" : ObjectId("5ccf14b2dceb9a92e6aa1950"), "StudentId" : "STU101" }정리하면, MongoDB에서 영숫자 정렬을 수행하려면 sort() 메서드와 함께 collation() 메서드를 연결하고, locale과 numericOrdering: true 옵션을 지정하면 됩니다. 이렇게 하면 문자열 안의 숫자가 문자가 아닌 숫자 값으로 비교되어 STU101 → STU908 → STU1010처럼 사람이 기대하는 자연스러운 순서로 데이터를 정렬할 수 있습니다.