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

MongoDB 문서에서 두 배열의 고유한 값 추출하기 — $setUnion 활용법

MongoDB에서 하나의 문서에 있는 두 배열 사이의 고유한(중복되지 않는) 값을 추출하려면 aggregate() 안에서 $setUnion 연산자를 사용하면 됩니다. $setUnion은 두 개 이상의 배열을 입력받아, 각 입력 배열에 등장하는 모든 요소를 중복 없이 하나의 배열로 합쳐서 반환합니다.

1. 테스트용 컬렉션 생성

먼저 예제로 사용할 컬렉션을 만들고 문서를 삽입해 보겠습니다.

> db.demo608.insertOne({
...   "ListOfName1": ["John", "Chris", "Bob", "David"],
...   "ListOfName2": ["Bob", "Sam", "John", "Robert", "Chris"]
... });
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e974542f57d0dc0b182d62b")
}

2. 저장된 문서 확인하기

find() 메서드를 사용해 컬렉션의 모든 문서를 조회할 수 있습니다.

> db.demo608.find().pretty();

위 명령을 실행하면 다음과 같은 결과가 출력됩니다.

{
    "_id" : ObjectId("5e974542f57d0dc0b182d62b"),
    "ListOfName1" : [
        "John",
        "Chris",
        "Bob",
        "David"
    ],
    "ListOfName2" : [
        "Bob",
        "Sam",
        "John",
        "Robert",
        "Chris"
    ]
}

3. $setUnion으로 두 배열의 고유한 값 구하기

다음은 하나의 MongoDB 문서 내에서 두 배열의 고유한 값을 추출하는 집계 쿼리입니다. $project 단계에서 $setUnion을 적용하여 새로운 필드 SetOfNames를 생성합니다.

> db.demo608.aggregate([
...     { $project: { SetOfNames: { $setUnion: ['$ListOfName1', '$ListOfName2'] } } }
... ]).pretty();

실행 결과는 다음과 같습니다.

{
    "_id" : ObjectId("5e974542f57d0dc0b182d62b"),
    "SetOfNames" : [
        "Bob",
        "Chris",
        "David",
        "John",
        "Robert",
        "Sam"
    ]
}

정리

결과를 보면 두 배열(ListOfName1, ListOfName2)에 걸쳐 중복된 이름("Bob", "Chris", "John")이 제거되고, 전체 고유한 이름 6개가 정렬된 형태로 반환된 것을 확인할 수 있습니다. 이처럼 $setUnion은 여러 배열 필드를 하나의 중복 없는 집합으로 병합할 때 매우 유용한 연산자입니다.