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

MongoDB에서 `SELECT UNIQUE(name) FROM collectionName WHERE age = "25"`에 해당하는 쿼리 작성하기

SQL의 SELECT DISTINCT 문과 동일한 결과를 얻고 싶다면, MongoDB에서는 distinct() 메서드를 사용하면 됩니다. 이 메서드는 특정 필드의 고유한 값들만 추출해 주며, 조건(쿼리 필터)을 함께 지정할 수도 있습니다.

1. 테스트용 컬렉션 생성

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

> db.distinctNameAndAgeDemo.insertOne({"ClientFirstName":"John","Age":23});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cd12759e3526dbddbbfb60b")
}
> db.distinctNameAndAgeDemo.insertOne({"ClientFirstName":"Larry","Age":25});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cd12768e3526dbddbbfb60c")
}
> db.distinctNameAndAgeDemo.insertOne({"ClientFirstName":"David","Age":25});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cd12773e3526dbddbbfb60d")
}
> db.distinctNameAndAgeDemo.insertOne({"ClientFirstName":"Carol","Age":26});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cd1277ee3526dbddbbfb60e")
}
> db.distinctNameAndAgeDemo.insertOne({"ClientFirstName":"Sam","Age":25});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cd12793e3526dbddbbfb60f")
}
> db.distinctNameAndAgeDemo.insertOne({"ClientFirstName":"Larry","Age":25});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cd127a3e3526dbddbbfb610")
}
> db.distinctNameAndAgeDemo.insertOne({"ClientFirstName":"Carol","Age":26});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cd127aae3526dbddbbfb611")
}

2. 전체 문서 확인하기

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

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

위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.

{
    "_id" : ObjectId("5cd12759e3526dbddbbfb60b"),
    "ClientFirstName" : "John",
    "Age" : 23
}
{
    "_id" : ObjectId("5cd12768e3526dbddbbfb60c"),
    "ClientFirstName" : "Larry",
    "Age" : 25
}
{
    "_id" : ObjectId("5cd12773e3526dbddbbfb60d"),
    "ClientFirstName" : "David",
    "Age" : 25
}
{
    "_id" : ObjectId("5cd1277ee3526dbddbbfb60e"),
    "ClientFirstName" : "Carol",
    "Age" : 26
}
{
    "_id" : ObjectId("5cd12793e3526dbddbbfb60f"),
    "ClientFirstName" : "Sam",
    "Age" : 25
}
{
    "_id" : ObjectId("5cd127a3e3526dbddbbfb610"),
    "ClientFirstName" : "Larry",
    "Age" : 25
}
{
    "_id" : ObjectId("5cd127aae3526dbddbbfb611"),
    "ClientFirstName" : "Carol",
    "Age" : 26
}

출력 결과를 보면 나이가 25세인 고객이 Larry, David, Sam, Larry로 총 4명이며, 그중 Larry는 중복되어 있습니다.

3. DISTINCT에 해당하는 distinct() 쿼리 실행

SQL의 SELECT DISTINCT(name) FROM collectionName WHERE age = "25"와 동일한 역할을 하는 MongoDB 쿼리는 다음과 같습니다.

> db.distinctNameAndAgeDemo.distinct("ClientFirstName", {"Age": 25});

실행 결과는 아래와 같습니다.

[ "Larry", "David", "Sam" ]

결과 정리

distinct() 메서드의 첫 번째 인수에는 고유값을 구하고자 하는 필드명(ClientFirstName)을, 두 번째 인수에는 필터 조건({"Age": 25})을 전달합니다. 그 결과 나이가 25세인 고객들의 이름에서 중복이 제거된 값만 배열 형태로 반환됩니다.

이처럼 MongoDB에서는 SQL의 DISTINCT + WHERE 조합을 별도의 집계 파이프라인 없이도 distinct() 메서드 하나로 간단하게 처리할 수 있습니다.