2014-09-29 3 views
0

나는 매우 큰 컬렉션 (800k 이상)을 가지고 있으며 태그를 기반으로하는 자동 완성 (단어 시작 부분에만 기반) 기능에 대한 쿼리를 구현해야합니다. 내 문서는 다음과 같다 : 예를 들어 내 쿼리는 "AB"로 시작하고 그 결과가 "ABC이 tag1"될 것이다 "어떤 값"인 "somefield"가 모든 태그 것mongodb 빠른 태그 쿼리

{ 
    "_id": "theid", 
    "somefield": "some value", 
    "tags": [ 
     { 
      "name": "abc tag1", 
      "vote": 5 
     }, 
     { 
      "name": "hij tag2", 
      "vote": 22 
     }, 
     { 
      "name": "abc tag3", 
      "vote": 5 
     }, 
     { 
      "name": "hij tag4", 
      "vote": 77 
     } 
    ] 
} 

경우, "abc tag3"(이름 만). 쿼리의 속도는 삽입 및 업데이트 속도보다 훨씬 중요합니다.

여기서는 집계 프레임 워크가 올바른 방법이라고 가정하지만 매우 빠른 쿼리의 경우 최상의 파이프 라인과 인덱스는 무엇입니까?

문서는 클라이언트 개체를 나타내는 문서 인 '태그'문서가 아니며 단순함을 위해 생략 한 훨씬 많은 데이터 필드를 포함하고 있으며 각 클라이언트에는 여러 개의 태그와 다른 필드가 있습니다. 태그 배열과 혼동). 클라이언트 그룹에있는 모든 태그를 중복하지 않고 세트를 가져와야합니다.

+0

나는 작년과 비슷한 것을 시도했지만 데이터베이스는 훨씬 작았습니다. 데이터 양이 늘어남에 따라 Solr을 사용해야하는 번거 로움이있었습니다. – Martin

+0

당신이 시도한 쿼리와 인덱스를 게시 할 수 있습니까? 집계 프레임 워크를 사용 했습니까? – jacob

+0

죄송합니다. 코드는 오래 전에 없어졌지만 태그 필드의 정규식을 기반으로했습니다. 그것은 어 그리 게이션 프레임 워크를 선행하지만 어쨌든 최선의 접근 방식이 될지 확신하지 못합니다. 내 경험에 따르면 집계 프레임 워크는 전체 문서를 메모리로 읽는 것을 좋아하지만, 일치 항목이 – Martin

답변

0

문서 구조가 이해가 안됩니다. tags은 배열이면서 객체가 아니라고 가정합니다. 다음과 같은 검색어를 사용해보십시오.

db.tags.find({ "somefield" : "some value", "tags.name" : /^abc/ }) 

{ "maintag" : 1, "tags.name" : 1 }에 색인이 있습니다. MongoDB는 left-anchored regex 쿼리를 범위 쿼리로 최적화합니다.이 쿼리는 인덱스를 사용하여 효율적으로 수행 할 수 있습니다 ($regex docs 참조).

당신은 단지 집계 파이프 라인을 사용하여이 문서 구조에서 태그를 얻을 수 있습니다

: 쿼리로 파이프 라인

db.tags.aggregate([ 
    { "$match" : { "somefield" : "some value", "tags.name" : /^abc/ } }, 
    { "$unwind" : "$tags" }, 
    { "$match" : { "tags.name" : /^abc/ } }, 
    { "$project" : { "_id" : 0, "tag_name" : "$tags.name" } } 
]) 

지수는 첫번째 $의 경기를하는 데 도움이, 그래서 같은 인덱스를.

+0

인 색인 만 사용하여도 내 개체에서 실수를 저 지르더라도 수정했습니다. 당신의 질의는 조건에 맞는 모든 문서를 반환 할 것이고, 중복없이 적합 할 수있는 태그 목록 만 필요합니다. 그렇지 않으면 불필요한 데이터를 가져옵니다. – jacob

+0

$ 위치 연산자는 일치하는 태그를 1 개 투영 할 수 있습니다. 모든 태그를 반환해야하는 경우 문서를 부적절하게 구조화했습니다. 문서는 태그가 첨부 된 기본 태그 문서 대신에 비정규 화 된 기본 태그가있는 태그 여야합니다. – wdberkeley

+0

내 질문에 명확하지 않은 것 같아요, 내 편집을 참조하십시오. 그것의 태그 문서가 아닌 태그의 중첩 된 사기성 배열을 가진 클라이언트 문서. – jacob