2016-06-24 6 views
2

에서 필드를 계산하는 방법은 일부 문서는 다른 양의 예를이는 MongoDB를 집계

{ 
    "_id": ObjectId("5644c495d0807a1750043237"), 
    "siteid": "123456" 
    "amount": 1.32 
} 

같은 항목이있는 문서가 있습니다. "cashbackAmount"

각 금액 입력란에 sumcount을 입력하고 싶습니다. 모든 문서에 모든 금액 필드가 들어있는 것은 아닙니다.

나는 그것은 나에게 합계를 제공하는 다음

{ 
    $group: { 
     "_id": "$siteid", 
     item2: { "$sum": "$amount" }, 
     item3: { "$sum": "$totalAmount" }, 
     item4: { "$sum": "$cashbackAmount" }, 
     item5: { "$sum": "$unitPrice" }, 
    } 
} 

을 시도 hjave하지만 각 금액 필드가 존재하는 횟수를 얻는 방법 작동하지 않을 수 있습니다.

{ "$sum": 1 } 총계 필드 중 하나를 가진 모든 문서를 제공하기 때문에 작동하지 않습니다.

+0

'각 금액 필드가 존재하는 횟수를 구하십시오'란 무엇을 의미합니까? 예상되는 출력 예제를 줄 수 있습니까? – Shrabanee

답변

1

나는 당신이 아마 완 추측 이런 식으로

db.getCollection('amounts').aggregate([ 
    { 
     $project: { 
      siteid: 1, 
      amount: 1, 
      totalAmount: 1, 
      unitPrice: 1, 
      cashbackAmount: 1, 
      amountPresent: { 
       $cond: { 
        if: "$amount", 
        then: 1, 
        else: 0 
       } 
      }, 
      totalAmountPresent: { 
       $cond: { 
        if: "$totalAmount", 
        then: 1, 
        else: 0 
       } 
      }, 
      cashbackAmountPresent: { 
       $cond: { 
        if: "$cashbackAmount", 
        then: 1, 
        else: 0 
       } 
      }, 
      unitPricePresent: { 
       $cond: { 
        if: "$unitPrice", 
        then: 1, 
        else: 0 
       } 
      } 
     } 
    }, 
    { 
     $group: { 
      "_id": "$siteid", 
      amountSum: { "$sum": "$amount" }, 
      amountCount: { "$sum": "$amountPresent" }, 
      totalAmountSum: { "$sum": "$totalAmount" }, 
      totalAmountCount: { "$sum": "$totalAmountPresent" }, 
      cashbackAmountSum: { "$sum": "$cashbackAmount" }, 
      cashbackAmountCount: { "$sum": "$cashbackAmountPresent" }, 
      unitPriceSum: { "$sum": "$unitPrice" }, 
      unitPriceCount: { "$sum": "$unitPricePresent" } 
     } 
    } 
]) 
+0

그래도 고마워요 – user3782299

+0

그럼 당신을 도운 응답을하십시오 (뿐만 아니라 내) :) – DAXaholic

+0

내가 명성을 얻을 때 할 것입니다 – user3782299

1

금액 필드를 미리 알고 있다면 파이프 라인을 동적으로 생성하는 단일 집계 작업에서이를 수행 할 수 있습니다. 다음 데모 밖으로

확인 :

var amountFields = ["amount", "totalAmount", "cashbackAmount", "unitPrice"], 
    groupOperator = { "$group": { "_id": "$siteid" } }; 

amountFields.forEach(function (field){ 
    groupOperator["$group"][field+"Total"] = { "$sum": "$"+field }; 
    groupOperator["$group"][field+"Count"] = { 
     "$sum": {    
      "$cond": [ { "$gt": [ "$"+field, null ] }, 1, 0 ] 
     } 
    }; 
}); 

db.test.aggregate([groupOperator]); 

채우기 시험 문서

db.test.insert([ 
    { 
     "siteid": "123456", 
     "amount": 1.32 
    }, 
    { 
     "siteid": "123456", 
     "cashbackAmount": 8.32 
    }, 
    { 
     "siteid": "123456", 
     "cashbackAmount": 9.74 
    }, 
    { 
     "siteid": "123456", 
     "unitPrice": 0.19 
    }, 
    { 
     "siteid": "123456", 
     "amount": 27.8, 
     "totalAmount": 15.22, 
     "unitPrice": 5.10, 
     "cashbackAmount": 43.62  
    }, 
    { 
     "siteid": "123456", 
     "unitPrice": 5.07 
    }, 
    { 
     "siteid": "123456", 
     "amount": 12.98, 
     "totalAmount": 32.82 
    }, 
    { 
     "siteid": "123456", 
     "amount": 6.65, 
     "unitPrice": 5.10 
    } 
]) 

샘플 집계 출력

{ 
    "_id" : "123456", 
    "amountTotal" : 48.75, 
    "amountCount" : 4, 
    "totalAmountTotal" : 48.04, 
    "totalAmountCount" : 2, 
    "cashbackAmountTotal" : 61.68, 
    "cashbackAmountCount" : 3, 
    "unitPriceTotal" : 15.46, 
    "unitPriceCount" : 4 
} 
+0

고마워요 "$ cond": [{ "$ gt": [ "$"+ 필드, null]}, 1, 0] 가야했습니다 – user3782299