2017-10-16 1 views
-3

문서 객체 배열 내 요소이다 (60)보다 더 많은 점수의 합을 반환해야 :는 점수가 JSON 내가 아래와 같이하고 JSON의</strong> 객체를 배열 <strong><em>등급</em>의 길이가 변하는 내 MongoDB의 컬렉션이

{ 
"address": { 
    "building": "1007", 
    "coord": [-73.856077, 40.848447], 
    "street": "Morris Park Ave", 
    "zipcode": "10462" 
}, 
"borough": "Bronx", 
"cuisine": "Bakery", 
"grades": [{ 
    "date": { 
     "$date": 1393804800000 
    }, 
    "grade": "A", 
    "score": 2 
}, { 
    "date": { 
     "$date": 1378857600000 
    }, 
    "grade": "A", 
    "score": 6 
}, { 
    "date": { 
     "$date": 1358985600000 
    }, 
    "grade": "A", 
    "score": 10 
}, { 
    "date": { 
     "$date": 1322006400000 
    }, 
    "grade": "A", 
    "score": 9 
}, { 
    "date": { 
     "$date": 1299715200000 
    }, 
    "grade": "B", 
    "score": 14 
}], 
"name": "Morris Park Bake Shop", 
"restaurant_id": "30075445" 
} 

{ 
"address": { 
    "building": "469", 
    "coord": [-73.961704, 40.662942], 
    "street": "Flatbush Avenue", 
    "zipcode": "11225" 
}, 
"borough": "Brooklyn", 
"cuisine": "Hamburgers", 
"grades": [{ 
    "date": { 
     "$date": 1419897600000 
    }, 
    "grade": "A", 
    "score": 8 
}, { 
    "date": { 
     "$date": 1404172800000 
    }, 
    "grade": "B", 
    "score": 23 
}, { 
    "date": { 
     "$date": 1367280000000 
    }, 
    "grade": "A", 
    "score": 12 
}, { 
    "date": { 
     "$date": 1336435200000 
    }, 
    "grade": "A", 
    "score": 12 
}], 
"name": "Wendy'S", 
"restaurant_id": "30112340" 
} 

작업은이 작업을 수행 할 수있는 방법 (60) 다음

+3

수행 한 작업 코드를 표시 할 수 있습니까? –

+1

달성하고자하는 일에 약간의 노력을 기울이십시오. 당신이 어딘가에 갇혀 있다면 우리는 당신을 도와 드리겠습니다. 아무도 여기에 코드를 작성하지 않습니다. – Shrabanee

+0

안녕 Shrabanee, 나는 시도하고 많은 해결책을 찾지 못했습니다. 그것이이 포럼에 질문했습니다. 네가 도울 수 있다면 그걸 그만 두거나 아니면 그만 둔다. 당신이 아인슈타인이라고 생각하지 마십시오. 당신이 도울 것이라고 말했어. 나는 명확하게 질문을 설명했다. 이제 코드를 작성하지 않고 해결책을 게시한다. –

답변

0

보다 더 큰 점수의 합계가있는 컬렉션을 반환하는 MongoDB의 쿼리를 작성하는 것입니다 :

db.collection.aggregate({ 
    $unwind: "$grades" // flatten the "grades" array 
}, { 
    $group: { 
     "_id": "$_id", 
     "sumOfScores": { // calculate the sum of all grades for all documents with the same "_id" 
      $sum: "$grades.score" 
     }, 
     "docs": { 
      $push: "$$ROOT" // remember all affected documents per group 
     } 
    } 
}, { 
    $match: { 
     "sumOfScores": { 
      $gt: 60 // filter out everything that we don't care about 
     } 
    } 
}, { 
    $unwind: "$docs" // flatten the "docs" array 
}, { 
    $group: { // restore the original document structure 
     "_id": "$docs._id", 
     "address": { $first: "$docs.address" }, 
     "borough": { $first: "$docs.borough" }, 
     "cuisine": { $first: "$docs.cuisine" }, 
     "grades": { 
      $push: "$docs.grades" 
     }, 
     "name": { $first: "$docs.name" }, 
     "restaurant_id": { $first: "$docs.restaurant_id" } 
    } 
})