programing

동일한 mongodb 쿼리에서 개수 및 고유 개수별 그룹화 선택

telecom 2023. 7. 4. 21:41
반응형

동일한 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

반응형