2013-12-23 2 views
1

자주 사용하는 검색어에 대한 복합 색인을 만들려고합니다.Mongo 복합 색인 사용

두 개의 필드가 있습니다. IP 주소를 포함하는 String 유형의 '클라이언트'필드. 다른 하나는 Date 유형의 'sendOn'필드입니다. 나는 클라이언트가 null이고 sendOn이 특정 범위 사이에있는 문서를 찾고있다.

> db.queries.ensureIndex({"client":1,"sendOn":1}) 

> db.queries.find({ $query: { client: { $exists: false } , sendOn: { $gt: new Date(1387664033883), $lt: new Date(1387750493883) } } }).explain() 

{ 
     "cursor" : "BasicCursor", 
     "nscanned" : 2546133, 
     "nscannedObjects" : 2546133, 
     "n" : 0, 
     "millis" : 25071, 
     "nYields" : 0, 
     "nChunkSkips" : 0, 
     "isMultiKey" : false, 
     "indexOnly" : false, 
     "indexBounds" : { 

     } 
} 

문서가 있다고

가 sendOn 필드에 정렬 오름차순을 지원하기 위해, 나는 내가 그래서 1

의 값을 가진 sendOn 인덱스를 필요가 설립 한, 나는

를 실행했습니다 $ exists 쿼리는 일반적으로 비효율적입니다. 필자는 문서에 적어도 하나 이상의 빈 클라이언트 필드가 포함되어야한다고 생각했습니다. 그러나 해당 쿼리는 인덱스를 사용하지 않습니다.

답변

1

색인을 사용해야합니다 ($ exists 연산자를 색인에 맞게 최적화하지 않은 경우 앞에서 언급 한 것처럼 $ existing을 null 값으로 대체해야합니다).

당신은 어떤 점에서 여기 일을 엉망으로 될 수있다

db.queries.find({ $query: { client: null , sendOn: { $gt: new Date(1387664033883), $lt: new Date(1387750493883) } }, $explain: true }); 
+0

이 시도

http://docs.mongodb.org/manual/reference/operator/meta/query/

: 문서는 당신이 $ 쿼리 형식() .explain 사용해서는 안 상태 null 바로 가기 주셔서 감사합니다. 친숙한 것을 가지고있는 것이 좋습니다. – EthernetCable