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

MongoDB에서 배열로 그룹별 결과 조회하기 – $addToSet 연산자 활용법

배열 형태로 그룹화된(group by) 결과를 조회하려면 MongoDB의 aggregate() 메서드를 사용하면 됩니다. 이때 $addToSet 연산자를 함께 활용합니다. $addToSet은 배열에 값을 추가하는 연산자로, 이미 동일한 값이 존재하는 경우에는 아무 작업도 수행하지 않기 때문에 중복 없이 고유한 값만 배열에 담을 수 있습니다.

1. 샘플 컬렉션 생성하기

먼저 insertOne() 메서드를 사용해 문서가 담긴 컬렉션을 생성합니다.

> db.demo498.insertOne({id:1,Name:["Chris"]});{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e86192b987b6e0e9d18f553")
}
> db.demo498.insertOne({id:2,Name:["David"]});{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e86192d987b6e0e9d18f554")
}
> db.demo498.insertOne({id:3,Name:["Chris"]});{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e861931987b6e0e9d18f555")
}
> db.demo498.insertOne({id:4,Name:["Bob"]});{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e861942987b6e0e9d18f556")
}
> db.demo498.insertOne({id:5,Name:["David"]});{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e861947987b6e0e9d18f557")
}

2. 컬렉션의 전체 문서 확인하기

find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.

> db.demo498.find();

위 쿼리는 다음과 같은 결과를 출력합니다.

{ "_id" : ObjectId("5e86192b987b6e0e9d18f553"), "id" : 1, "Name" : [ "Chris" ] }
{ "_id" : ObjectId("5e86192d987b6e0e9d18f554"), "id" : 2, "Name" : [ "David" ] }
{ "_id" : ObjectId("5e861931987b6e0e9d18f555"), "id" : 3, "Name" : [ "Chris" ] }
{ "_id" : ObjectId("5e861942987b6e0e9d18f556"), "id" : 4, "Name" : [ "Bob" ] }
{ "_id" : ObjectId("5e861947987b6e0e9d18f557"), "id" : 5, "Name" : [ "David" ] }

3. 배열로 그룹화된 결과를 조회하는 쿼리

다음은 MongoDB에서 배열 형태로 그룹별 결과를 조회하는 쿼리입니다. 먼저 $unwind로 Name 배열을 개별 요소로 분리한 뒤, $group 단계에서 이름을 기준으로 묶고 $addToSet으로 각 이름에 해당하는 id 값을 중복 없이 수집합니다.

> db.demo498.aggregate([{
...    $unwind : "$Name"
... }, {
...      $group : {
...        _id : "$Name",
...        Id : {
...           $addToSet : "$id"
...        }
...      }
...   }
... ])

위 집계 파이프라인은 다음과 같은 결과를 반환합니다.

{ "_id" : "David", "Id" : [ 5, 2 ] }
{ "_id" : "Bob", "Id" : [ 4 ] }
{ "_id" : "Chris", "Id" : [ 3, 1 ] }

결과를 보면 이름(Name)을 기준으로 그룹화되었고, 해당 이름을 가진 문서들의 id 값이 배열(Id) 형태로 수집된 것을 확인할 수 있습니다. $addToSet 덕분에 동일한 값이 중복되지 않고 각각 한 번씩만 배열에 포함됩니다.