2011-03-27 7 views
2

임베디드 된 모든 문서를 반환하는 가장 효율적인 방법은 무엇입니까?mongoid : 모든 임베디드 문서를 반환하십시오.

사용자가 ActiveRecord에 여러 개의 주소가 임베드되어 있다고 가정하면 Address.count를 사용하여 해당 개수를 얻을 수 있습니다. 이 일을하는 임베디드 문서/몽고 버전은 무엇입니까?

어떨 때는 그 레벨이 2 이상입니까? Product> Pressing> Variations ... 모든 저자의 모든 책에서 모든 챕터를 어떻게 확인할 수 있습니까? 말하자면 루비와 어떻게 다른가?

Product has_many Pressings 
Pressing has_many Variations 

Product 
    def self.pressings 
    all.collect { |p| p.pressings }.flatten 
    end 
    def self.variations 
    self.pressings.collect { |p| p.variations }.flatten 
    end 
end 

답변

4

@maga에 따르면 Map/Reduce가 실시간 집계에 비해 너무 느리고 카운트 필드를 저장하는 것이 가장 좋은 방법이라고합니다.

다른 옵션은 전체 문서 (또는 특정 필드)를 응용 프로그램에 반환하고 거기에서 구문 분석하도록하는 것입니다. 이것은 얼마나 많은 중첩 된 레벨이 존재하는지 알지 못할 때 가장 좋습니다.

사람들이 생각하는 것 일지라도, 이렇게하는 데 전혀 해가 없습니다. 데이터베이스 서 v는 기꺼이이. 서를 매우 빨리 리턴하고 응용 프로그램이 사후 처리를 처리 할 수 ​​있도록합니다.

확장 성 측면에서 볼 때이 접근법은 일반적으로 데이터베이스 서버 (일반적으로 더 비쌉니다) 대신 응용 프로그램 서버 (일반적으로 더 저렴한)를 확장한다는 것을 의미합니다.

+0

내 게시물을 Ruby 코드로 업데이트했습니다. 그런 식으로지도 작성/축소하는 것이 이점이 있습니까? – brewster

+0

실시간으로 데이터가 필요한 경우 m/r을 사용하면 많은 이점이 있다고 생각하지 않습니다. 나중에 액세스 할 수 있도록 다른 곳에 저장되는 데이터의 오프라인 처리에는 맵/축소가 유용합니다. 약간 오래된 데이터를 사용할 수 있으면 m/r 작업으로 충분합니다. –

2

Map/reduce은 MongoDB에서 데이터 및 집계 연산의 배치 처리에 유용합니다.

5

일반적으로 함수 (더 구체적인 상황을 포함하여 map/reduce 포함)로 처리되었지만 상대적으로 느리고 무거운 응용 프로그램에서 실시간으로 사용하기에 적합하지 않습니다. 따라서 성능이 문제가되는 경우 추가 필드를 제안하고 변경 사항이 발생하고 수시로 집계 함수에 의해 수정 될 때 atomic operations으로 업데이트됩니다.

관련 문제