2013-04-29 4 views
2

내 앱에는 Item 및 Comment의 두 가지 모델이 있습니다. Item은 많은 주석을 가질 수 있고 Comment 인스턴스는 관계를 추적하기 위해 'comment'키가있는 Item 인스턴스에 대한 참조를 포함합니다.항목 목록에 설명 개수를 채우는 방법은 무엇입니까?

이제 사용자가 특정 URL에 대해 요청할 때 모든 항목의 JSON 목록을 주석 개수와 함께 보내야합니다.

function(req, res){ 
    return Item.find() 
    .exec(function(err, items) { 
     return res.send(items); 
    }); 
}; 

항목에 대한 의견 수를 어떻게 "채울 수 있습니까?"확실하지 않습니다. 이것은 일반적인 문제인 것처럼 보입니다. 나는 무력보다이 일을 더 잘하는 방법이 있어야한다고 생각하는 경향이 있습니다.

의견을 보내주십시오. 아이템에 대한 코멘트 수를 "채우는"방법은 무엇입니까?

답변

0

나는이 문제에 대한 몇 가지 조사를했고, 다음과 같은 결과를 내놓았다. 첫째, MongoDB를 워드 프로세서 suggest : 일반적으로

사용 임베디드 데이터 모델 때

  • 는 당신이 엔티티 사이의 관계를 "포함".
  • "많은"개체가 항상 부모 문서의 컨텍스트에서 나타나거나 보았던 일대 다 관계가 있습니다. Comment의 대신 독립적 인 존재를 필요없이 Item들에 포함되는 경우

그래서 내 상황에서 훨씬 더 의미가 있습니다.

그럼에도 불구하고 필자는 데이터 모델을 변경하지 않고도 해결책을 알고 싶어했습니다.MongoDB에서 mentioned으로 문서 :

참조는 포함보다 유연성이 뛰어납니다. 그러나 참조를 해결하려면 클라이언트 측 응용 프로그램에서 후속 쿼리를 발행해야합니다. 즉, 참조를 사용하면 서버로 더 많은 왕복이 필요합니다.

var showList = function(req, res){ 

    // first DB roundtrip: fetch all items 
    return Item.find() 
     .exec(function(err, items) { 
      // second DB roundtrip: fetch comment counts grouped by item ids 
      Comment.aggregate({ 
       $group: { 
        _id: '$item', 
        count: { 
         $sum: 1 
        } 
       } 
      }, function(err, agg){ 
       // iterate over comment count groups (yes, that little dash is underscore.js) 
       _.each(agg, function(itr){ 
        // for each aggregated group, search for corresponding item and put commentCount in it 
        var item = _.find(items, function(item){ 
         return item._id.toString() == itr._id.toString(); 
        }); 
        if (item) { 
         item.set('commentCount', itr.count); 
        } 
       }); 
       // send items to the client in JSON format 
       return res.send(items); 
      })   
     }); 

}; 

동의 :

여러 왕복 나는 다음과 같은 솔루션 함께했다, 지금 정결입니까? 동의하지 않는다? 의견을 남겨주세요!

더 좋은 답변이 있으면 여기에 게시하십시오. 가치가 있다고 생각한다면 받아 들일 것입니다.

0

MongoDB 설명서를 확인하고 findAndModify() 메서드를 찾으십시오.이 도구를 사용하여 문서를 원자 적으로 업데이트 할 수 있습니다. 주석을 추가하고 동시에 문서 카운터를 증가시킵니다.

findAndModify

findAndModify 명령은 원자 수정하고 하나의 문서를 반환합니다. 기본적으로 반환 된 문서에는 업데이트에 대한 수정 내용이 포함되어 있지 않습니다. 업데이트시 수정 한 내용으로 문서를 반환하려면 새 옵션을 사용하십시오.

는 의견에 내장 된 배열에 실제 주석을 추가하는 업데이트 사업자 카운터에 대한 $inc$addToSet과 함께 update 옵션을 사용합니다.

db.runCommand(
      { 
       findAndModify: "item", 
       query: { name: "MyItem", state: "active", rating: { $gt: 10 } }, 
       sort: { rating: 1 }, 
       update: { $inc: { commentCount: 1 }, 
         $addToSet: {comments: new_comment} } 
      } 
      ) 

참조 :

MongoDB: findAndModify

MongoDB: Update Operators

+0

답장을 보내 주셔서 감사합니다. @Tilo. 당신의 기술은 새로운 매개 변수 "commmentCount"를 내 Item 모델에 추가하고 새로운 코멘트가 Item에 추가 될 때마다 업데이트한다는 것을 제안합니다. 이 접근법은 실용적으로 보이지만, commentCount를 즉시 계산하여 저장/업데이트 할 필요없이 Item 모델에 추가하는 방법이 있는지 궁금합니다. – craftsman

+0

확실히,'comments' 배열을 가져 와서 그것의 크기를 사용할 수도 있습니다. – Tilo

+0

예, 배열 항목을 넘겨 주어야합니다. 각각 배열 항목을 전달해야합니다. 각각은 자체 commentCount를가집니다. 그렇게 할 수있는 방법이 있습니까? – craftsman

관련 문제