2013-10-09 6 views
0

제품 컬렉션이 있습니다. 대부분의 제품에는 카테고리, 하위 카테고리 및 하위 카테고리가 있으며 일부 제품은 그 중 하나 또는 두 개만 있습니다. 저는 현재 그것들을 배열 필드 'category'에 저장하고 있는데, "book"유형의 제품에 대해서는 [ "독일", "문학", "소설"]처럼 보일 수 있습니다 (약 15 가지 유형이 있습니다. 자신의 카테고리 트리).
내가 원하는 것은 검색을 수행하는 것입니다. 아마도 10K 개의 일치 항목이 있고, 브라우저에 100을 반환하고, 쿼리에 대해 found-counts가있는 범주 목록을 제공 할 수도 있습니다. 카테고리가 무엇인지 미리 알지 못하고 변경 될 수도 있습니다.MongoDB 카테고리 집계 테이블

다른 방법으로 내가 찾고 있어요 :

  • 맵리 듀스,하지만 난이 "느린"하고 내가 가진
  • 한 가지 제안은 집계했다 라이브 검색보다는 매일 통계에 더 기어드 듣고 -> $ 그룹 : 이것을 보았습니다. 그러나 나는 그것들이 단순히 합산하거나 평균을내는 것 대신에 가치를 계산할 수있는 방법을 볼 수 없습니다. 나는 무엇인가 놓치고 있습니까? 커서의 각 범주에 대한 루프 검색을 단순히 반환 카운트()
  • 모든 제품, 단지 카테고리 필드를 반환하는 두 번째 검색을 수행, 그래서 생산 코드
  • 의 수를 할 수 있습니다. 이 작업을하려면 분명히 카테고리를 알아야하고 마지막 수단처럼 보일 것입니다.

기본적으로 내 질문은 "가장 좋은 방법은 무엇입니까?"라고 합리적으로 빠르고 배율이 높아야합니다. .

사용자가 카테고리를 클릭 한 후에도 동일하게 적용됩니다. 결과는 해당 카테고리의 하위 카테고리에 대해 집계되어야하며, 하위 카테고리가있는 경우 결과가 계산되어야합니다.

추가 정보 : 우리는 아직 데이터를 가지고 있지 않기 때문에 몇 백만 개의 제품을 가지고있을 것입니다. 그러나이 제품을 테스트하는 것은 어렵습니다. 현재 약 50K 제품 만이 미래 계획에 포함되어 있습니다. "제품"이외의 다른 데이터).
카테고리를 올바른 방식으로 저장하고 있거나 별도의 필드 여야합니까? 도움이 될까요? 현재 배열에 3 개의 항목이 있지만 나중에 증가 할 수 있습니다.
는 새로운 MongoDB를에 만 범주를 명확히 .. 지금까지 MySQL과


을 많이했다; "book"유형의 예제 제품의 경우 "german"이 주 카테고리이고 "literature"는 하위 카테고리이며 "novels"는 하위 카테고리입니다. 다른 주요 범주는 5-6 개의 다른 언어 (서적)이고 다른 하위 범주는 예 : "academic & study", "business"또는 "travel & languages"입니다. 하위 카테고리는 하위 카테고리에 따라 달라집니다 (마지막으로 SSC는 "외국어 학습", "사회 언어학"등이 될 수 있습니다). 나는 하나의 필드에 3 개를 모두 배열로서 제품 당 저장하고있다.
"book"유형에 대해 "foo"를 검색하면 영어 123 제품, 독일어 456 제품, 프랑스어 789 제품을 찾을 수 있습니다. 내가 원했던 것은 제품이 발견 된 모든 주요 (언어) 카테고리의 목록과 발견 된 제품의 수를 표시하는 것입니다.
누군가 "독일어"를 선택하면 다른 검색어를 사용하여 하위 카테고리 ("& 학문"의 44 개, "비즈니스"의 57 개)에서 발견 된 독일 도서의 수를 표시합니다.

+1

나는 확실히 당신이 필요로 계산 어떤 데이터 구조가 무엇인지 이해하지 못하는 (업데이트 쿼리는 경우에 대비하여 카테고리는 배열이 아닌 하나의 문자열이다). ''독일인 ','문학 ','소설 ''은 나무의 길인가? 조금 더 자세히 설명해 주시겠습니까? – mnemosyn

+0

나는 그것을 다소 분명히하려고 노력했다. 내 생각에 [[sub] 하위] 범주는 일종의 트리 구조로 볼 수 있지만이 컬렉션 (atm) 외부에 정의 된 범주는 아닙니다. – MSpreij

+0

아직 지원되지 않는 $ group : { "_id": "$ category.0"}'이 필요하기 때문에 실제로는 가능하지 않습니다. https : //jira.mongodb.org/browse/SERVER-4589 – mnemosyn

답변

0
나는 현재 배열 필드 '카테고리'에 저장하고있어

, 그것은 당신이 하나 개의 배열을 사용해서는 안

[ "독일어", "문학", "소설"]처럼 보일 수 있습니다 "카테고리", "하위 카테고리"및 "하위 하위 카테고리"인 세 가지 필드가 있습니다.

또한 언어를 "언어"가 아닌 범주로 저장하는 이유는 무엇입니까? 일을 더 복잡하게 만들 때 도움이되기 때문에 데이터베이스의 "스키마"에 약간의 논리를 추가하십시오.

이렇게하면 배열 내부를 쿼리 할 필요가 없으므로 더 정확한 결과를 얻을 수 있기 때문에 집계를 사용하는 것이 훨씬 쉽습니다 (더 빠른 것, 샤드 된 클러스터에서 가능함). 그 값이 너무 정말 작기 때문에해야 필드의 이름 (범주의 "C", "SC"하위 범주에 대한 하위 하위 범주에 대한 "SCC"),이 같은 :

{ _id : xxxxxxxxxxxx , name : "A novel of german literature" , c : "german", sc : "literature", ssc : "novels" } 

무엇 나는 것 할 일은 검색을하는 것입니다. 어쩌면 10K 개의 일치 항목이 있고, 브라우저에 100을 반환하고, 쿼리에 대해 찾은 횟수가있는 범주 목록을 제공 할 수도 있습니다. 카테고리가 무엇인지 미리 알지 못하고 변경 될 수도 있습니다.

mongo는 스키마가 없으므로 모든 레코드에 대해이 필드를 모두 설정할 필요가 없습니다. 제품간에 스키마가 많이 다를 계획이라면 각 제품마다 다른 컬렉션을 사용해야하지만 그럴 수밖에 없습니다.

내가 원하는 것은 검색을 수행하는 것입니다. 일치하는 항목이 10K 개이고, 브라우저에 100을 반환하고, 쿼리에 대해 found-counts가있는 범주 목록을 제공 할 수도 있습니다. 카테고리가 무엇인지 미리 알지 못하고 변경 될 수도 있습니다.

indexes 잘 활용 (인덱스의 많은 종류가있다 그리고 당신은 아마도 하나 이상 사용해야합니다)와 불과 100 레코드를 반환하는 $ 그룹과 $limit와 집계를 사용합니다.

사용자가 카테고리를 클릭하면 동일하게 나타납니다. 그런 다음 결과는 해당 카테고리의 하위 카테고리에 대해 집계되어야하며, 하위 카테고리가있는 경우 결과가 계산되어야합니다. 이 쿼리는 현재 카테고리에 대한 존재하는 모든 하위 범주의 배열을 반환합니다

db.products.aggregate([{ $match : { "c" : "german"}},{ $group : { _id : {"c" : "$c"}, $addToSet :{ "subcategories" : "$sc"}}}]) 

: 여기

은 (이전에 기술 된 스키마를 사용하여) 모든 카테고리의 하위 범주를 얻기 위해 샘플 쿼리입니다.

db.products.aggregate([{ $match : { "c" : {$elemMatch : {"german" : 1, "english" : 1}}}},{ $group : { _id : {"c" : "$c"}, $addToSet :{ "subcategories" : "$sc"}}}]) 
+0

카테고리의 수는 변경 될 수 있으므로 배열에 넣어야합니다. 'category'와 'language'의 경우, 다른 주요 카테고리를 가진 많은 다른 유형의 제품이 있습니다. 예측할 수없는 제품 유형은 여러 가지 출처에서 나옵니다. 이러한 출처도 범주를 정의합니다. – MSpreij

+0

@Makis : 대답은 많은 노력을 보여 주지만주의해야 할 두 가지 인수가 있습니다. 1) 경로를 배열로 저장하는 것은 몇 가지 드라이버가 형식 구분 기호에 대해 수행하는 작업입니다. 다중 키 인덱스 2) 여러 인덱스를 사용하면 mongodb가 쿼리 당 하나의 인덱스 만 사용할 수 있기 때문에 작동하지 않을 수 있습니다. – mnemosyn

+0

@mnemosyn : 1)주의를 기울여야하나요? "경로"라는 단어로 무엇을 의미합니까? 2) 나는 필요할 수있는 각 경우에 대해 여러 개의 색인을 만들어야 함을 의미합니다. 그룹에 대해 위에서 복합 인덱스 (다중 키 인덱스 [제한 인식] (http://docs.mongodb.org/manual/core/index-multikey/#limitations)를 포함)가 도움이 될 것입니다. 나중에 필요할 수있는보다 간단한 u 리를 위해 더 간단한 인덱스를 추가하십시오. –