Docs Menu
Docs Home
/
MongoDB 매뉴얼
/ /

사용자 기본 설정 데이터를 사용한 집계

이 페이지의 내용

  • 데이터 모델
  • 단일 필드 반환
  • 문서 정규화 및 정렬
  • 가입 월별로 정렬된 사용자 이름 반환
  • 월별 총 가입 인원 반환
  • '좋아요'를 가장 많이 받은 상위 5개 항목 반환

회원 이름, 가입 날짜 및 스포츠 선호도를 추적하는 members 컬렉션 이 있는 스포츠 클럽 데이터베이스 를 가정해 보겠습니다.

db.members.insertMany( [
{
_id: "jane",
joined: ISODate("2011-03-02"),
likes: ["golf", "racquetball"]
},
{
_id: "joe",
joined: ISODate("2012-07-02"),
likes: ["tennis", "golf", "swimming"]
},
{
_id: "ruth",
joined: ISODate("2012-01-14"),
likes: ["golf", "racquetball"]
},
{
_id: "harold",
joined: ISODate("2012-01-21"),
likes: ["handball", "golf", "racquetball"]
},
{
_id: "kate",
joined: ISODate("2012-01-14"),
likes: ["swimming", "tennis"]
}
] )

다음 작업은 $project 을 사용하여 members 컬렉션 의 모든 문서에 대해 _id 필드 만 반환합니다.

db.members.aggregate(
[
{ $project: { _id: 1 } }
]
)

이 작업은 다음 문서를 반환합니다.

[
{ _id: 'jane' },
{ _id: 'joe' },
{ _id: 'ruth' },
{ _id: 'harold' },
{ _id: 'kate' }
]

기본 쿼리 및 프로젝션 작업의 경우 find() 메서드를 사용하는 표준 쿼리가 최상의 성능을 발휘합니다.

다음 작업은 멤버 이름을 대문자와 알파벳 순서로 반환합니다. 처리 할 멤버 이름을 정규화하기 위해 이 작업을 수행할 수 있습니다.

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

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

  • $project 연산자:

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

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

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

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

이 연산은 다음과 같은 결과를 반환합니다.

[
{ name: 'HAROLD' },
{ name: 'JANE' },
{ name: 'JOE' },
{ name: 'KATE' },
{ name: 'RUTH' }
]

다음 집계 작업은 가입한 달을 기준으로 정렬된 멤버 이름을 반환합니다. 이 집계 을 사용하여 멤버십 갱신 알림을 생성할 수 있습니다.

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

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

  • $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: 3, name: 'jane' },
{ month_joined: 7, name: 'joe' }
]

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

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

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

  • $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: 3 }, number: 1 },
{ _id: { month_joined: 7 }, number: 1 }
]

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

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

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

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

    예시

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

    {
    _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: 4 },
{ _id: 'racquetball', number: 3 },
{ _id: 'tennis', number: 2 },
{ _id: 'swimming', number: 2 },
{ _id: 'handball', number: 1 }
]

돌아가기

우편번호 예시