문서 메뉴

문서 홈애플리케이션 개발MongoDB 매뉴얼

사용자 기본 설정 데이터를 사용한 애그리게이션

이 페이지의 내용

  • 데이터 모델
  • 문서 정규화 및 정렬

사용자의 가입 날짜 및 스포츠 선호도를 추적하고 다음과 유사한 문서에 이러한 데이터를 저장하는 users 컬렉션이 포함된 데이터베이스를 가진 가상의 스포츠 클럽을 예로 들어 보겠습니다.

{
_id : "jane",
joined : ISODate("2011-03-02"),
likes : ["golf", "racquetball"]
}
{
_id : "joe",
joined : ISODate("2012-07-02"),
likes : ["tennis", "golf", "swimming"]
}

다음 작업은 사용자 이름을 대문자와 알파벳순으로 반환합니다. 이 애그리게이션에는 users 컬렉션의 모든 문서에 대한 사용자 이름이 포함되어 있습니다. 처리할 사용자 이름을 정규화하기 위해 이 작업을 수행할 수 있습니다.

db.users.aggregate(
[
{ $project : { name:{$toUpper:"$_id"} , _id:0 } },
{ $sort : { name : 1 } }
]
)

users 컬렉션의 모든 문서는 다음 작업으로 구성된 파이프라인을 통과합니다.

  • $project 연산자:

    • name이라고 명명된 새 필드를 만듭니다.

    • $toUpper 연산자를 사용하여 _id 값을 대문자로 변환합니다. 그런 다음 $project는 이 값을 저장하기 위해 name이라는 이름의 새 필드를 만듭니다.

    • id 필드를 표시하지 않습니다. $project는 명시적으로 억제하지 않는 한 기본적으로 _id 필드를 전달합니다.

  • $sort 연산자는 name 필드를 기준으로 결과를 정렬합니다.

애그리게이션 결과는 다음과 유사합니다:

{
"name" : "JANE"
},
{
"name" : "JILL"
},
{
"name" : "JOE"
}

가입 월별로 정렬된 사용자 이름 반환

다음 애그리게이션 작업은 가입한 달을 기준으로 정렬된 사용자 이름을 반환합니다. 이러한 종류의 애그리게이션은 멤버십 갱신 알림을 생성하는 데 도움이 될 수 있습니다.

db.users.aggregate(
[
{ $project :
{
month_joined : { $month : "$joined" },
name : "$_id",
_id : 0
}
},
{ $sort : { month_joined : 1 } }
]
)

파이프라인은 다음 작업을 통해 users 컬렉션의 모든 문서를 전달합니다.

  • $project 연산자:

    • 두 개의 새 필드를 만듭니다: month_joinedname.

    • 결과에서 id를 표시하지 않습니다. aggregate() 메서드에는 명시적으로 억제하지 않는 한 _id를 포함합니다.

  • $month 연산자는 joined 필드의 값을 월별 정수 표현으로 변환합니다. 그런 다음 $project 연산자가 해당 값을 month_joined 필드에 할당합니다.

  • $sort 연산자는 month_joined 필드를 기준으로 결과를 정렬합니다.

이 연산은 다음과 유사한 결과를 반환합니다:

{
"month_joined" : 1,
"name" : "ruth"
},
{
"month_joined" : 1,
"name" : "harold"
},
{
"month_joined" : 1,
"name" : "kate"
}
{
"month_joined" : 2,
"name" : "jill"
}

월별 총 가입 인원 반환

다음 연산은 한 해 동안 월별로 얼마나 많은 사람이 가입했는지를 보여줍니다. 채용 및 마케팅 전략을 위해 이 애그리게이션 데이터를 사용할 수 있습니다.

db.users.aggregate(
[
{ $project : { month_joined : { $month : "$joined" } } } ,
{ $group : { _id : {month_joined:"$month_joined"} , number : { $sum : 1 } } },
{ $sort : { "_id.month_joined" : 1 } }
]
)

파이프라인은 다음 작업을 통해 users 컬렉션의 모든 문서를 전달합니다.

  • $project 연산자는 month_joined라는 새 필드를 만듭니다.

  • $month 연산자는 joined 필드의 값을 월별 정수 표현으로 변환합니다. 그런 다음 $project 연산자가 month_joined 필드에 값을 할당합니다.

  • $group 연산자는 주어진 month_joined 값을 가진 모든 문서를 수집하고 해당 값에 대한 문서 개수를 계산합니다. 구체적으로 $group은 각 고유 값에 대해 두 개의 필드가 있는 새로운 '월별' 문서를 생성합니다:

    • _id: 여기에는 month_joined 필드와 해당 값이 포함된 중첩 문서가 포함되어 있습니다.

    • number: 생성된 필드입니다. $sum 연산자는 지정된 month_joined 값을 포함하는 모든 문서에 대해 이 필드를 1씩 증가시킵니다.

  • $sort 연산자는 $group에서 만든 문서를 month_joined 필드의 내용에 따라 정렬합니다.

이 애그리게이션 작업의 결과는 다음과 같습니다.

{
"_id" : {
"month_joined" : 1
},
"number" : 3
},
{
"_id" : {
"month_joined" : 2
},
"number" : 9
},
{
"_id" : {
"month_joined" : 3
},
"number" : 5
}

'좋아요'를 가장 많이 받은 상위 5개 항목 반환

다음 애그리게이션은 데이터 세트에서 '좋아요(Liked)'를 가장 많이 받은 상위 5개 활동을 수집합니다. 이러한 유형의 분석은 계획 및 향후 개발 정보를 제공하는 데 도움이 될 수 있습니다.

db.users.aggregate(
[
{ $unwind : "$likes" },
{ $group : { _id : "$likes" , number : { $sum : 1 } } },
{ $sort : { number : -1 } },
{ $limit : 5 }
]
)

파이프라인은 users 컬렉션의 모든 문서로 시작하고 다음 작업을 통해 이러한 문서를 전달합니다.

  • $unwind 연산자는 likes 배열의 각 값을 구분하고 배열의 모든 요소에 대해 소스 문서의 새 버전을 만듭니다.

    예제

    users 컬렉션에 다음 문서가 주어집니다

    {
    _id : "jane",
    joined : ISODate("2011-03-02"),
    likes : ["golf", "racquetball"]
    }

    $unwind 연산자는 다음과 같은 문서를 생성합니다.

    {
    _id : "jane",
    joined : ISODate("2011-03-02"),
    likes : "golf"
    }
    {
    _id : "jane",
    joined : ISODate("2011-03-02"),
    likes : "racquetball"
    }
  • $group 연산자는 likes 필드에 대해 동일한 값을 가진 모든 문서를 수집하고 각 그룹을 계산합니다. 이 정보를 사용하여 $group은 두 개의 필드가 있는 새 문서를 생성합니다.

    • _id: likes 값을 포함합니다.

    • number: 생성된 필드입니다. $sum 연산자는 지정된 likes 값을 포함하는 모든 문서에 대해 이 필드를 1씩 증가시킵니다.

  • $sort 연산자는 number 필드를 기준으로 이러한 문서를 역순으로 정렬합니다.

  • $limit 연산자는 결과에서 처음 5개의 문서만 포함합니다.

애그리게이션 결과는 다음과 같습니다:

{
"_id" : "golf",
"number" : 33
},
{
"_id" : "racquetball",
"number" : 31
},
{
"_id" : "swimming",
"number" : 24
},
{
"_id" : "handball",
"number" : 19
},
{
"_id" : "tennis",
"number" : 18
}
← 우편 번호 데이터 세트를 사용한 애그리게이션