동일한 mongodb 쿼리에서 개수 및 고유 개수별 그룹화 선택
저는 다음과 같은 것을 하려고 노력하고 있습니다.
select campaign_id,campaign_name,count(subscriber_id),count(distinct subscriber_id)
group by campaign_id,campaign_name from campaigns;
이 쿼리는 카운트(distent subscriber_id)를 제외한 결과를 제공합니다.
db.campaigns.aggregate([
{$match: {subscriber_id: {$ne: null}}},
{$group: {
_id: {campaign_id: "$campaign_id",campaign_name: "$campaign_name"},
count: {$sum: 1}
}}
])
카운트(subscriber_id)를 제외한 결과를 제공하는 다음 쿼리
db.campaigns_logs.aggregate([
{$match : {subscriber_id: {$ne: null}}},
{$group : { _id: {campaign_id: "$campaign_id",campaign_name: "$campaign_name",subscriber_id: "$subscriber_id"}}},
{$group : { _id: {campaign_id: "$campaign_id",campaign_name: "$campaign_name"},
count: {$sum: 1}
}}
])
하지만 같은 결과로 카운트(subscriber_id), 카운트(distent subscriber_id)를 원합니다.
여러분은 올바른 방향으로 향하면서 여기서 올바른 노선을 따라 생각하기 시작했습니다.SQL 사고방식을 바꾸는 것은 실제로 두 언어로 작업을 작성하는 또 다른 방법일 뿐입니다.즉, 여기서 두 개의 그룹 작업이 수행되고 집계 파이프라인 측면에서 두 개의 파이프라인 단계가 수행됩니다.
시각화할 수 있는 단순화된 문서만 있으면 다음과 같습니다.
{
"campaign_id": "A",
"campaign_name": "A",
"subscriber_id": "123"
},
{
"campaign_id": "A",
"campaign_name": "A",
"subscriber_id": "123"
},
{
"campaign_id": "A",
"campaign_name": "A",
"subscriber_id": "456"
}
주어진 "캠페인" 조합에 대해 총 카운트와 "구분" 카운트가 각각 "3"과 "2"인 것은 당연합니다.따라서 논리적으로 해야 할 일은 먼저 모든 "subscriber_id" 값을 "그룹화"하고 각 값에 대한 발생 횟수를 유지한 다음 "파이프라인"을 생각하면서 "캠페인"별로 발생 횟수를 "합계"한 다음 "별도"로 계산하는 것입니다.
db.campaigns.aggregate([
{ "$match": { "subscriber_id": { "$ne": null }}},
// Count all occurrences
{ "$group": {
"_id": {
"campaign_id": "$campaign_id",
"campaign_name": "$campaign_name",
"subscriber_id": "$subscriber_id"
},
"count": { "$sum": 1 }
}},
// Sum all occurrences and count distinct
{ "$group": {
"_id": {
"campaign_id": "$_id.campaign_id",
"campaign_name": "$_id.campaign_name"
},
"totalCount": { "$sum": "$count" },
"distinctCount": { "$sum": 1 }
}}
])
첫 번째 "그룹" 후 출력 문서를 다음과 같이 시각화할 수 있습니다.
{
"_id" : {
"campaign_id" : "A",
"campaign_name" : "A",
"subscriber_id" : "456"
},
"count" : 1
}
{
"_id" : {
"campaign_id" : "A",
"campaign_name" : "A",
"subscriber_id" : "123"
},
"count" : 2
}
따라서 샘플의 "3개" 문서에서 "2"는 하나의 고유한 값에 속하고 "1"은 다른 값에 속합니다.다음 단계에서 수행한 일치하는 문서의 총합과 최종 결과를 얻기 위해 이 값을 계속 합산할 수 있습니다.
{
"_id" : {
"campaign_id" : "A",
"campaign_name" : "A"
},
"totalCount" : 3,
"distinctCount" : 2
}
집계 파이프라인에 대한 매우 좋은 비유는 유닉스 파이프 "|" 연산자입니다. 이 연산자는 한 명령의 출력을 다음 명령의 입력으로 전달할 수 있도록 작업을 "체인"할 수 있습니다.이러한 방식으로 처리 요구사항을 고려하기 시작하면 집계 파이프라인의 작업을 더 잘 이해하는 데 도움이 됩니다.
SQL 쿼리: (별도로 그룹화 및 개수)
select city,count(distinct(emailId)) from TransactionDetails group by city;
동등한 mongo 쿼리는 다음과 같습니다.
db.TransactionDetails.aggregate([
{$group:{_id:{"CITY" : "$cityName"},uniqueCount: {$addToSet: "$emailId"}}},
{$project:{"CITY":1,uniqueCustomerCount:{$size:"$uniqueCount"}} }
]);
언급URL : https://stackoverflow.com/questions/24761266/select-group-by-count-and-distinct-count-in-same-mongodb-query
'programing' 카테고리의 다른 글
목록의 예외를 처리하는 방법은 무엇입니까? (0) | 2023.07.09 |
---|---|
SpringBoot + ActiveMQ - 신뢰할 수 있는 패키지를 설정하는 방법 (0) | 2023.07.04 |
Visual Studio Code - 여전히 VS Code에 표시되는 GitHub에서 삭제된 분기를 제거하시겠습니까? (0) | 2023.07.04 |
GitHub에서 호스팅되는 Spring Cloud Config Server에서 repo 액세스 시 인증 문제가 발생했습니다. (0) | 2023.07.04 |
속성 "_id" 하나만 반환합니다. (0) | 2023.07.04 |