2012-03-06 2 views
20

많은 필드를 처리하는 연락처 데이터베이스를 구현하고 있습니다. 그들 중 대부분은 미리 정의되어 있고 바운드라고 여겨 질 수 있지만, 그렇지 않은 커플이 있습니다. 우리는이 필드들 중 하나를 '그룹'이라고 부를 것입니다.개체 배열과 개체 배열에 대한 Mongo 인덱싱

'groups' : { 
    152 : 'hi', 
    111 : 'group2' 
} 

을하지만 일부 읽은 후 나는 내가 그 일을해야 보인다했습니다 : 우리가 현재 그것을 구현하는 방법입니다 (각 문서/접점은 '그룹'필드가)

'groups' : [ 
    { 'id' : 152, 'name' : 'hi' }, 
    { 'id' : 111, 'name' : 'group2' } 
    ... 
] 

과 다음 인덱스를 적용 db.contact.ensureIndex({'groups.id':1});

내 질문에 관한 기능입니다. 두 구조의 차이점은 무엇이며 색인은 실제로 어떻게 만들어 졌는가? (단순히 각 문서/연락처 내에서 색인을 생성 할 것인가 아니면 모든 문서/연락처의 모든 그룹을 가진 본격적인 색인을 작성하는 것인가?)

나는 이것이 구조적으로 가장 좋은 방법이라고 가정하고 있지만 잘못된 것이면 알려주세요.

답변

35

'그룹'은 각각 'id'와 'name'이있는 하위 문서의 배열 인 쿼리가 확실히 두 번째 경우에 훨씬 쉬울 것입니다.

Mongo는 "와일드 카드"쿼리를 지원하지 않으므로 문서가 첫 번째 방법으로 구성되어 있고 값이 "hi"인 하위 문서를 찾고 싶지만 키가 152임을 알지 못한다면 그것을 할 수 없습니다. 두 번째 문서 구조를 사용하면 { "groups.name": "hi"}를 쉽게 쿼리 할 수 ​​있습니다. 포함 된 개체를 쿼리에 대한 자세한 내용은

, "도트 표기법은 (객체에 도달)" "고급 쿼리"섹션 "포함 된 개체의 값"과 http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects%29 은 "배열의 가치"라는 제목의 문서를 참조하십시오

{ 'groups.id': 1}에 대한 색인의 경우 모든 문서의 모든 '그룹'배열에있는 모든 'id'키에 대해 색인 항목이 만들어집니다. "그룹"에 대한 색인을 사용하면 문서 당 하나의 색인 항목 만 생성됩니다.

두 번째 유형의 문서와 그룹에 대한 색인이있는 경우 색인을 사용하려면 쿼리가 전체 하위 문서와 일치해야합니다. 예를 들어, 문서 제공 :

{ "_id" : 1, "groups" : [ { "id" : 152, "name" : "hi" }, { "id" : 111, "name" : "group2" } ] } 

db.<collectionName>.find({groups:{ "id" : 152, "name" : "hi" }}) 

인덱스를 사용하게됩니다 쿼리하지만 쿼리를

db.<collectionName>.find({"groups":{$elemMatch:{name:"hi"}}}) 

또는

db.<collectionName>.find({"groups.name":"hi"}) 

하지 않습니다 .

만드는 색인은 가장 일반적으로 수행 할 쿼리에 따라 달라집니다.

쿼리가 .explain() 명령과 함께 사용하는 인덱스 (있는 경우)를 실험 할 수 있습니다. http://www.mongodb.org/display/DOCS/Explain 첫 번째 줄 "커서"는 어떤 색인이 사용되고 있는지 알려줍니다. "커서": "BasicCursor"는 전체 컬렉션 스캔이 수행되고 있음을 나타냅니다. http://www.mongodb.org/display/DOCS/Indexes

"Multikeys"라는 제목의 문서에 대한 위의 링크의 "인덱싱 배열 요소"섹션 : 문서에 색인에 대한 자세한 내용은이

http://www.mongodb.org/display/DOCS/Multikeys

는 희망이 개선이 임베디드 된 문서에 대한 쿼리 방법에 대한 이해 및 인덱스 사용 방법에 대해 설명합니다. 후속 질문이 있으면 알려주십시오.

+0

이것은 좋은 대답이지만 처음 두 링크가 깨졌습니다. 나는 수색 중이었고 그물에서 새 위치를 찾을 수 없다. 어떤 도움이 필요합니까? – portforwardpodcast

+0

안녕하세요, 당신의 응답을 읽어서, 나는'db. .find ({ "groups": { "id": 152}}})와 같은 쿼리에 인덱스가 사용되는지 궁금합니다. –