2013-06-24 5 views
0

나는 내 컬렉션에 같은 문서 구조를 가지고 범위 쿼리에 바인딩을 사용하지 않습니다MongoDB의 지수는

{ 
    "deviceId" : "9113", 
    "data" : { 
     "qIdx" : 106 
     "points" : [ 
      { "eDate" : "2013-06-10T00:00:13.000Z" } , 
      { "eDate" : "2013-06-10T00:00:14.000Z" } 
     ] 
    } , 
    "rdate" : { "$date" : "2013-05-30T22:25:04.359Z"} , 
    "_id" : { "$oid" : "51a7d1c0debcab563502cc41" } 
} 

내가 가진 인덱스 :

{deviceId: 1, data.points.eDate: 1} 

내가 좋아하는 쿼리를 수행 할 때 :

{ 
    deviceId: "9113", 
    data.points.eDate: { 
     $gt: "2013-05-11T00:00:00.000Z", 
     $lt:"2013-05-12T00:00:00.000Z" 
    } 
} 

색인은 하나의 경계를 사용하지 않습니다. 설명 :

,
{ 
    "cursor" : "BtreeCursor deviceId_1_data.points.eDate_1" , 
    "nscanned" : 4015 , 
    "nscannedObjects" : 4015 , 
    "n" : 10 , "millis" : 8297 , 
    "nYields" : 103 , 
    "nChunkSkips" : 0 , 
    "isMultiKey" : true , 
    "indexOnly" : false , 
    "indexBounds" : { 
     "deviceId" : [[ "9113" , "9113"]], 
     "data.points.eDate" : [ 
      [ "2013-05-11T00:00:00.000Z" , { }] 
     ] 
    } 
} 

내 MongoDB의 버전 모두 인덱스 범위를 사용하는 데 문제가 문서는 $된다하고 $ LT를 만족 다른 EDATE을 만족 한 EDATE를 가질 수 있다는 것이다 2.0.7

+0

귀하의 $ lt 및 $ gt 인수는 동일한 값을 가지므로 귀하의 범위는 어떻게 되겠습니까? 최신 MongoDB 버전 (2.4.4)으로 업그레이드 할 것을 강력히 권합니다. – Derick

+0

고정 된 것, 그냥 오타입니다 –

+0

좋아, 시도합시다. 나는 이것이 2.2/2.4에서 크게 향상되었다고 확신한다. – Derick

답변

4

이다. 쿼리의 sematics가 해당 문서와 일치하기 때문에 두 contstraint를 모두 사용하는 경우보다 더 많은 문서를 조사해야합니다.

$ elemMatch (http://docs.mongodb.org/manual/reference/projection/elemMatch/ 참조) 및 cursor.min/cursor.max (http://docs.mongodb.org/manual/reference/method/cursor.min/)와 같은 유형의 사례에 도움이되는 사항이 있습니다.

+0

아, 맞습니다 - 제 대답을 삭제했습니다. – Derick

+0

나는 elemMatch로 확인했다 : db.so.find ({deviceId : "9113", 'data.points': {$ elemMatch : { 'eDate': {$ gt : "2013-05-11T00 : 00 : 00.000Z ", $ lt :"2013-05-12T00 : 00 : 00.000Z "}}}}) .explain(); --- 여전히 똑같은 출력을 내고 있습니다. – Derick

+0

@Derick이 잠들기 시작했는데 SERVER-6050이 필요하다고 생각합니다. 또는 약간 다른 스키마인데, eDate는 $ elemMatch가이 특별한 경우에 작동하기위한 배열이지만 희망적으로는 작동합니다. cursor.min/cursor.max가 작동합니다. SERVER-3766과 같은 최소/최대 한계가 있지만이 경우에는 괜찮을 것이라고 생각합니다. –