MongoDB에서 배열 내부의 요소들을 정렬하려면 $sort 연산자를 사용하고, 특정 필드를 투영(projection)하려면 aggregate() 메서드와 함께 $project 단계를 사용하면 됩니다.
1. 샘플 데이터 준비
먼저 문서가 포함된 컬렉션을 생성해 보겠습니다.
> db.demo252.insertOne(
... {"Values" : [ { "v1" : 20, "v2" :30 }, { "v1" : 20, "v2" : 20 }, { "v1" : 10, "v2" : 7 } ] }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e46c2761627c0c63e7dba78")
}2. 저장된 문서 확인
find() 메서드를 사용하여 컬렉션의 모든 문서를 조회합니다.
> db.demo252.find();
위 쿼리는 다음과 같은 결과를 출력합니다.
{ "_id" : ObjectId("5e46c2761627c0c63e7dba78"), "Values" : [ { "v1" : 20, "v2" : 30 }, { "v1" : 20, "v2" : 20 }, { "v1" : 10, "v2" : 7 } ] }현재 Values 배열은 정렬되어 있지 않은 상태입니다.
3. 배열을 정렬하고 모든 필드를 투영하는 쿼리
다음은 aggregate()를 사용하여 배열을 정렬하고 모든 필드를 투영하는 쿼리입니다.
> db.demo252.aggregate([
... { "$unwind": "$Values"},
... { "$sort": {"Values.v2":1, "Values.v1": 1}},
... { "$group": {
... "_id": {
... "_id": "$_id"
...
... },
... "st": { "$push":"$Values"}
... }},
... { "$project": {
... "_id": "$_id._id",
... "Values": "$st"
... }}
...]);파이프라인 단계 설명
- $unwind: Values 배열을 해제하여 각 배열 요소를 개별 문서로 만듭니다.
- $sort: v2와 v1 필드를 기준으로 오름차순(1) 정렬을 수행합니다.
- $group: 원래 문서의 _id를 기준으로 요소들을 다시 그룹화하고, $push로 정렬된 순서대로 배열을 재구성합니다.
- $project: 최종 출력 형태를 지정하여 원래의 _id와 정렬된 Values 배열만 반환합니다.
4. 실행 결과
위 쿼리는 다음과 같은 결과를 출력합니다.
{ "_id" : ObjectId("5e46c2761627c0c63e7dba78"), "Values" : [ { "v1" : 10, "v2" : 7 }, { "v1" : 20, "v2" : 20 }, { "v1" : 20, "v2" : 30 } ] }출력 결과를 보면 Values 배열이 v2, v1 값을 기준으로 오름차순으로 정렬되었으며, 문서의 모든 필드가 그대로 유지된 것을 확인할 수 있습니다.