2017-12-27 4 views
0

내가 기부

{ 
    "_id" : 1, 
    "reqAmt" : 20, 
    "filled" : [ 
     { 
      userId : 1, 
      depAmt : 5 
     } 
    ] 
}, 

{ 
    "_id" : 2, 
    "reqAmt" : 20, 
    "filled" : [] 
}, 

예상 결과

{ 
    "_id" : 1, 
    "reqAmt" : 20, 
    "filledAmt" : 5 
}, 
{ 
    "_id" : 2, 
    "reqAmt" : 20, 
    "filledAmt" : 0 
} 

내가 시도라는 이름의 컬렉션이 잘못된 값을 반환합니다. 항상 아래

{ "_id" : null, "filledAmt" : 0 } 

이 문제는 당신이 를 작성하지만, 긴장을 풀려고한다는 것입니다

db.donation.aggregate([{$unwind:"$filled"},{$project:{"reqAmt":1,"filledAmt":1} },{$group:{"_id":null,"filledAmt":{"$sum":"$filled.depAmt"}}}]) 
+0

'{$ project : { "reqAmt": 1, "filled": 1}' – Veeram

+0

안녕하세요, 저는 벌써 시도했습니다. 그러나 같은 결과 : ( –

답변

0

코드입니다 반환이 빈 배열이고 전체 문서는 그 이유는 _ID에 대한 이 작업으로 생략됩니다. 이 문제를 해결하려면 배열이 비어있는 경우 ($cond 사용) $ project 기본 문서를 추가하는 것으로 시작할 수 있습니다. 그런 다음 두 필드를 합산하기 위해 _id로 풀고 그룹화 할 수 있습니다. 어레이가 비어 있으면 정의에 대해 0 인덱스 $arrayElemAt 비교

db.collection.aggregate(
    [ 
     { 
      $project: { 
       "reqAmt":1, 
       "filled": { 
        $cond: { 
         if: { $ne: [ { $arrayElemAt: [ "$filled", 0 ] }, undefined ] }, 
         then: "$filled", 
         else: [{depAmt: 0}] } 
        }, 
       _id: 1 
      } 
     }, 
     { $unwind:"$filled" }, 
     { 
      $group: { 
       _id: "$_id", 
       "reqAmt": { $sum: "$reqAmt" }, 
       "filledAmt": { $sum: "$filled.depAmt" }, 
      } 
     } 
    ] 
) 

단순히 확인한다.