2014-09-10 5 views
3

저는 처음으로 MongoDB입니다. 기본적으로 mongodb의 컬렉션에는 _id 필드의 인덱스가 있습니다. Java를 사용하여 2 개의 다른 필드에 인덱스를 만들어야합니다.Java를 사용하여 둘 이상의 필드가있는 mongodb에서 색인을 생성하십시오.

DBObject indexOptions = new BasicDBObject(); 
indexOptions.put(field_1, 1); 
indexOptions.put(field_2, -1); 
collection.createIndex(indexOptions) 

내가

[ 
     { 
       "v" : 1, 
       "key" : { 
         "_id" : 1 
       }, 
       "name" : "_id_", 
       "ns" : "schema.collection_name" 
     }, 
     { 
       "v" : 1, 
       "key" : { 
         "field_1" : 1, 
         "field_2" : -1 
       }, 
       "name" : "field_1_1_field_2_-1", 
       "ns" : "schema.collection_name" 
     } 
] 

나는 위 맞는지 확실하지 않다() MongoDB를에 db.collection_name.getIndexes를 사용하여 해당 쿼리합니다. 누군가 확인해 주시겠습니까? 올바르지 않으면 어떻게 수정해야합니까? 위와 같이

 DBObject subscriberIdObj = new BasicDBObject(field3, value3); 
     DBObject subscriberIdIsNullObj = new BasicDBObject(field3, null); 
     BasicDBList firstOrValues = new BasicDBList(); 
     firstOrValues.add(subscriberIdObj); 
     firstOrValues.add(subscriberIdIsNullObj); 
     DBObject firstOr = new BasicDBObject("$or", firstOrValues); 

     DBObject batchIdObj = new BasicDBObject(field1, value1); 
     DBObject fileNameObj = new BasicDBObject(field2, value2); 
     BasicDBList secondOrValues = new BasicDBList(); 
     secondOrValues.add(batchIdObj); 
     secondOrValues.add(fileNameObj); 
     DBObject secondOr = new BasicDBObject("$or", secondOrValues); 
     BasicDBList andValues = new BasicDBList(); 
     andValues.add(firstOr); 
     andValues.add(secondOr); 

     DBObject query = new BasicDBObject("$and", andValues); 
     DBCursor cursor = mongoDatastore.getDB().getCollection(collection_name).find(query); 

지금, 빠른 검색을 위해 내가 필드 1, FIELD2 및 FIELD3에 별도로 인덱스를 만들어야합니다

검색을 위해 내가 이런 일을하고, 위의에 추가? 또는 3 개의 모든 필드에 대한 복합 색인?

+0

예. 당신이 한 일은 정확합니다. 두 필드가있는 복합 인덱스를 만들었습니다. – BatScream

답변

4

정확하고 Compound Index이라고합니다. 두 필드 (field_1 (오름차순) 및 field_2 (내림차순))에 대한 색인을 만들었습니다. 따라서 예를 들어 field_1 오름차순으로 정렬하고 field_2 내림차순이거나 field_1 내림차순이고 field_2 오름차순 인 경우 MongoDb는이 인덱스 field_1_1_field_2_-1을 사용합니다.

그러나 위의 인덱스는 field_1 값을 오름차순으로 정렬 한 다음 field_2 값을 오름차순으로 정렬 할 수 없습니다. field_2 만 검색하거나 정렬하면이 색인이 사용되지 않습니다. 이 경우 field_1field_2에 대한 별도의 인덱스를 만들 수 있습니다.

쿼리가 인덱스를 사용하는지 확인하려면 explain()을 사용하고 어떤 커서가 사용되는지보십시오. 당신이 사용하는 커서가 BtreeCursor 것을 볼 경우 다음 쿼리는 그렇지 않은 BasicCursor의 경우 인덱스를 사용,

db.your_collection.find({ "field_1" : "something" }).explain() 

예를 들어, 다음과 같은 쿼리를 시도 할 수 있습니다.

자세한 내용은 this article을 참조하십시오.

+1

감사합니다. Yuriy..i는 field_2 만 검색 할 수 있으므로 별도의 색인을 만들어야합니까? 이 인덱스는 field_1과 field_2를 (전체적으로) 검색 할 때만 작동한다고합니까? – Anand

+0

예, field_2 만 검색해야하는 경우 별도의 색인이 필요하지만 쓰기가 느려지는 것을 잊지 마십시오. 이 인덱스는 field_1과 field_2를 결합하여 작동하지만 위에서 설명한대로 모든 경우가 아니며 field_1 만 검색하는 경우에도 작동합니다. –

+0

나는 색인이 느려지는 삽입물을 읽었습니다. 쓰기와 읽기 작업이 같은 비율로 발생한다는 것을 고려하면 색인을 위해 가야합니까? – Anand

관련 문제