[MONGODB] MongoDB의 조건부 $ 합
MONGODBMongoDB의 조건부 $ 합
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.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.버전 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.어레이 구문을 사용하는 위의 조각을 설명 :
어레이 구문을 사용하는 위의 조각을 설명 :
PosSentiment: {$cond: [{$gt: ['$Sentiment', 0]}, '$Sentiment', 0]}
와 동등하다:
PosSentiment: {$cond: { if: {$gt: ['$Sentiment', 0]}, then: '$Sentiment', else: 0} }
배열 구문은 롱 구문 요약 {$ COND를 [이면, 다른]}
from https://stackoverflow.com/questions/14102596/conditional-sum-in-mongodb by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] 어떻게 Node.js를에서 몽구스와 쪽수를 매기다? (0) | 2019.12.01 |
---|---|
[MONGODB] MongoDB를 놓아 내부 어레이 (0) | 2019.12.01 |
[MONGODB] 어떻게 전화와 몽구스의 배열로 객체의 배열을 밀어? (0) | 2019.12.01 |
[MONGODB] MongoDB의에서, 당신은 어떻게 인덱스에 의해 배열 요소를 제거합니까 (0) | 2019.12.01 |
[MONGODB] 어떻게 MongoDB의 문서에서 완전히 필드를 제거하려면? (0) | 2019.12.01 |