Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

MongoDB에서 배열을 정렬하고 모든 필드를 투영하는 방법

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: v2v1 필드를 기준으로 오름차순(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 값을 기준으로 오름차순으로 정렬되었으며, 문서의 모든 필드가 그대로 유지된 것을 확인할 수 있습니다.