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

MongoDB에서 $addToSet 연산자로 중복 없이 배열 값을 표시하는 방법

MongoDB에서 $addToSet 연산자를 사용하면 집합(set)에 중복된 항목이 추가되지 않도록 보장할 수 있습니다. 이 연산자는 기존에 동일한 값이 이미 존재하는 경우 새 값을 추가하지 않으므로, 고유한 값만 유지하고 싶은 배열 필드를 다룰 때 매우 유용합니다.

먼저 예제에 사용할 문서가 포함된 컬렉션을 생성해 보겠습니다.

1. 샘플 컬렉션 생성하기

> db.getDistinctDemo.insertOne({"Values":[100,200]});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cef69f9ef71edecf6a1f69d")
}
> db.getDistinctDemo.insertOne({"Values":[300,100]});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cef6a07ef71edecf6a1f69e")
}

위 명령을 실행하면 각각 [100, 200]과 [300, 100]이라는 배열 값을 가진 두 개의 문서가 생성됩니다.

2. 컬렉션의 모든 문서 조회하기

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

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

이 쿼리는 다음과 같은 출력을 반환합니다.

{
    "_id" : ObjectId("5cef69f9ef71edecf6a1f69d"),
    "Values" : [
        100,
        200
    ]
}
{
    "_id" : ObjectId("5cef6a07ef71edecf6a1f69e"),
    "Values" : [
        300,
        100
    ]
}

3. $addToSet으로 고유한 값 추출하기

다음은 aggregation 파이프라인에서 $group 단계와 $addToSet 연산자를 조합하여 배열 필드의 고유한(distinct) 값들을 가져오는 쿼리입니다.

> db.getDistinctDemo.aggregate([
    { "$group": { "_id": 0,
        "MyValues": { "$addToSet": "$Values" }
    } }
]);

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

{ "_id" : 0, "MyValues" : [ [ 300, 100 ], [ 100, 200 ] ] }

참고 사항

$addToSet은 배열 필드의 각 값을 하나의 완전한 요소로 취급합니다. 따라서 위 예제에서는 개별 숫자가 아닌 배열 자체([300, 100], [100, 200])가 집합의 요소로 추가되었습니다. 만약 배열 내부의 개별 값(100, 200, 300)을 기준으로 중복을 제거하고 싶다면, $group 단계 이전에 $unwind 단계를 먼저 적용하여 배열을 개별 문서로 분해한 후 $addToSet을 사용해야 합니다.