복붙노트

[MONGODB] 같은 MongoDB의 쿼리 수와 고유 한 카운트에서 그룹을 선택합니다

MONGODB

같은 MongoDB의 쿼리 수와 고유 한 카운트에서 그룹을 선택합니다

내가 좋아하는 뭔가를 시도하고있다

select campaign_id,campaign_name,count(subscriber_id),count(distinct subscriber_id)
group by campaign_id,campaign_name from campaigns;

수를 제외한 결과를 제공하는이 쿼리 (별개의 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)을 계산 같은 결과에 (별개의 subscriber_id) 계산합니다

해결법

  1. ==============================

    1.당신은 당신이 올바른 방향으로 향하고 있었다 여기에 오른쪽 라인을 따라 생각하기 시작했다. "별개의"SQL의 사고 방식을 변경하는 것은 정말 하나의 언어 달러 (A $) 그룹 작업을 작성하는 또 다른 방법입니다. 즉, 당신은 집계 파이프 라인 조건, 두 개의 파이프 라인 단계로, 여기에서 일어나고있는 두 그룹의 작업을합니다.

    당신은 당신이 올바른 방향으로 향하고 있었다 여기에 오른쪽 라인을 따라 생각하기 시작했다. "별개의"SQL의 사고 방식을 변경하는 것은 정말 하나의 언어 달러 (A $) 그룹 작업을 작성하는 또 다른 방법입니다. 즉, 당신은 집계 파이프 라인 조건, 두 개의 파이프 라인 단계로, 여기에서 일어나고있는 두 그룹의 작업을합니다.

    그냥 시각적으로 단순화 된 문서와 :

    {
        "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
    }
    

    그래서 하나 개의 별개의 값과 다른 "1"에 속하는 샘플의 "세"문서 "2"에서. 이것은 여전히 ​​최종 결과와 함께, 다음 단계에서 할 총 일치하는 문서를 얻기 위해 $ 합계로 집계 할 수 있습니다 :

    { 
        "_id" : { 
            "campaign_id" : "A", 
            "campaign_name" : "A"
        },
        "totalCount" : 3,
        "distinctCount" : 2
    }
    

    "|"집계 파이프 라인에 대한 정말 좋은 비유는 유닉스 파이프입니다 만약에 따라서 다음의 입력을 통해 하나 개의 명령의 출력을 통과 할 수 있도록 허용 작업자는 작업의 "체인화". 그 방법으로 처리 요구 사항 생각하기 시작하면 집계 파이프 라인 더와 작업을 이해하는 데 도움이 될 것입니다.

  2. ==============================

    2.SQL 쿼리 : (별개의 계산 및 그룹화)

    SQL 쿼리 : (별개의 계산 및 그룹화)

    select city,count(distinct(emailId)) from TransactionDetails group by city;
    

    등가 몽고의 쿼리는 다음과 같을 것이다 :

    db.TransactionDetails.aggregate([ 
    {$group:{_id:{"CITY" : "$cityName"},uniqueCount: {$addToSet: "$emailId"}}},
    {$project:{"CITY":1,uniqueCustomerCount:{$size:"$uniqueCount"}} } 
    ]);
    
  3. from https://stackoverflow.com/questions/24761266/select-group-by-count-and-distinct-count-in-same-mongodb-query by cc-by-sa and MIT license