복붙노트

[MONGODB] MongoDB의 조건부 $ 합

MONGODB

MongoDB의 조건부 $ 합

MongoDB의 나의 수집은 SQL에서 다음 표와 유사합니다 :

감정 (회사, 심리)

지금, 나는 다음과 같은 쿼리를 실행해야합니다

SELECT
  Company, 
  SUM(CASE WHEN Sentiment >0 THEN Sentiment ELSE 0 END) AS SumPosSenti, 
  SUM(CASE WHEN Sentiment <0 THEN Sentiment ELSE 0 END) AS SumNegSenti
FROM Sentiments
GROUP BY Company

나는 몽고에서이 쿼리를 작성하기 위해 무엇을해야합니까? 나는 다음과 같은 쿼리에 붙어입니다 :

db.Sentiments.aggregate(
{ $project: {_id:0, Company:1, Sentiment: 1} },
{ $group: {_id: "$Company", SumPosSenti: {$sum: ? }, SumNegSenti: {$sum: ? } } }
);

해결법

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

    1.Sammaye 제안, 당신은이 작업을 수행 할 $ 콘드 집계 프로젝션 연산자를 사용합니다 :

    Sammaye 제안, 당신은이 작업을 수행 할 $ 콘드 집계 프로젝션 연산자를 사용합니다 :

    db.Sentiments.aggregate(
        { $project: {
            _id: 0,
            Company: 1,
            PosSentiment: {$cond: [{$gt: ['$Sentiment', 0]}, '$Sentiment', 0]},
            NegSentiment: {$cond: [{$lt: ['$Sentiment', 0]}, '$Sentiment', 0]}
        }},
        { $group: {
            _id: "$Company",
            SumPosSentiment: {$sum: '$PosSentiment'},
            SumNegSentiment: {$sum: '$NegSentiment'}
        }});
    
  2. ==============================

    2.버전 3.4부터는는 $ 조별 논리 상태를 처리 할 수있게하여 $ 스위치 조작을 사용할 수있다. 물론 우리는 여전히 합계를 반환 $ 합계의 누적를 사용해야합니다.

    버전 3.4부터는는 $ 조별 논리 상태를 처리 할 수있게하여 $ 스위치 조작을 사용할 수있다. 물론 우리는 여전히 합계를 반환 $ 합계의 누적를 사용해야합니다.

    db.Sentiments.aggregate(
        [
            { "$group": { 
                "_id": "$Company",  
                "SumPosSenti": { 
                    "$sum": { 
                        "$switch": { 
                            "branches": [ 
                                { 
                                    "case": { "$gt": [ "$Sentiment", 0 ] }, 
                                    "then": "$Sentiment"
                                }
                            ], 
                            "default": 0 
                        }
                    }
                }, 
                "SumNegSenti": {
                    "$sum": { 
                        "$switch": { 
                            "branches": [ 
                                { 
                                    "case": { "$lt": [ "$Sentiment", 0 ] }, 
                                    "then": "$Sentiment"
                                }
                            ], 
                            "default": 0 
                        } 
                    }
                }
            }}
        ]
    )
    

    아직 3.4 이상에 mongod를 마이그레이션하지 않은 경우,이 대답에 $ 프로젝트 단계는 중복주의 때문에 $ 콘드 연산자 반환 숫자 값을 그룹화 문서를 $과 $에 $ 합계를 적용 할 수있는 수단 COND 식입니다.

    특히 대형 컬렉션에 대한 응용 프로그램의 성능이 향상됩니다.

    db.Sentiments.aggregate(
        [
            { '$group': {
                '_id': '$Company',
                'PosSentiment': { 
                    '$sum': {
                        '$cond': [
                            { '$gt': ['$Sentiment', 0]}, 
                            '$Sentiment', 
                            0
                        ]
                    }
                },
                'NegSentiment': { 
                    '$sum': {
                        '$cond': [
                            { '$lt': ['$Sentiment', 0]}, 
                            '$Sentiment', 
                            0
                        ]
                    }
                }
            }}
        ]
    )
    

    다음의 서류와 컬렉션 감정을 고려 :

    { "Company": "a", "Sentiment" : 2 }
    { "Company": "a", "Sentiment" : 3 }
    { "Company": "a", "Sentiment" : -1 }
    { "Company": "a", "Sentiment" : -5 }
    

    집계 쿼리를 생성합니다

    { "_id" : "a", "SumPosSenti" : 5, "SumNegSenti" : -6 }
    
  3. ==============================

    3.어레이 구문을 사용하는 위의 조각을 설명 :

    어레이 구문을 사용하는 위의 조각을 설명 :

    PosSentiment: {$cond: [{$gt: ['$Sentiment', 0]}, '$Sentiment', 0]}
    

    와 동등하다:

    PosSentiment: {$cond: { if: {$gt: ['$Sentiment', 0]}, then: '$Sentiment', else: 0} }
    

    배열 구문은 롱 구문 요약 {$ COND를 [이면, 다른]}

  4. from https://stackoverflow.com/questions/14102596/conditional-sum-in-mongodb by cc-by-sa and MIT license