2014-06-13 2 views
1

필드가 문서에 동적으로 추가되는 MongoDB 컬렉션 스키마가 있습니다. 동적으로 추가 된 필드가있는 문서를 검색 할 때 쿼리가 매우 느립니다. 샘플 문서는 다음과 같이 :MongoDB에서 동적으로 추가 된 필드에 인덱스 생성

{ 
    "_id" : ObjectId("4657439ad7f616df3f49"), 
    "name" : "test1", 
    "created_at" : ISODate("2014-06-13T10:48:41.501Z"), 
    "Status" : "NEW", 
    "email":"[email protected]", 
    "rank":1278 

} 

필드 이름, 이메일, 순위는 동적으로 사용자가 생성하고 문서에 추가됩니다. 응답하기에 매우 오랜 시간이 걸리는 이러한 필드를 사용하여 쿼리합니다. 자연 및 필드 자체가 동적으로 추가되기 때문에 이러한 필드에 인덱스가 작성되지 않습니다. 여기() .explain 시도 출력했다 :

{ 
    "cursor" : "BasicCursor", 
    "isMultiKey" : false, 
    "n" : 1, 
    "nscannedObjects" : 1683063, 
    "nscanned" : 1683063, 
    "nscannedObjectsAllPlans" : 1683063, 
    "nscannedAllPlans" : 1683063, 
    "scanAndOrder" : false, 
    "indexOnly" : false, 
    "nYields" : 4, 
    "nChunkSkips" : 0, 
    "millis" : 1708, 
    "indexBounds" : { 

    } 

이 명확하게 인덱싱을 할 필요가 있음을 보여줍니다. 그러나 이러한 비 결정적 필드에 인덱스를 작성하는 방법에 대한 단서가 없습니다. 참고 * :이 문서에는 here과 같이 포함 된 문서가 없습니다. 나는 MongoDB를 처음 사용한다.

답변

0

비 결정적 필드에 색인을 만들 수 있습니다. 그냥 sparse indexes을 사용하십시오.

db.myCollection.ensureIndex({ "name": 1 }, { sparse: true }); 
+0

동적으로 추가 될 때까지 알 수없는 경우 제출 된 '이름'에 대한 색인을 어떻게 추가 할 수 있습니까? – Astro

+1

음 ... 자동화를 찾고 사용자가 필드를 추가 할 수 있다면 검색중인 각 필드에 대한 쿼리를 실행하기 전에 인덱스를 확인할 수 있습니다. 처음으로, ensureIndex 명령은 아무 효과가 없으며 반복해도 무방합니다. 이것은 물론 N 개의 인덱스가있는 컬렉션으로 이어질 수 있습니다. 그것은 상쇄 관계에 있습니다. – amenadiel

0

나는 Mongo DB에 대해 잘 모르지만, 데이터베이스와 테이블에 관해서는 결정적이지 않은 필드에 인덱스를 생성하는 데 문제가 없다. 그 DB에 대한 추가 부담이 될 것입니다 ... 그리고 무거운 retrival 동안 귀하의 쿼리가 느려질 수도 있습니다 ..

관련 문제