2014-09-18 2 views
0

현재 데이터베이스를 Mongo 2.4.9에서 2.6.4로 마이그레이션 중입니다.MongoDB - 2.6에서 작동하지 않는 쿼리

나는 2.4에서 좋은 결과를주는 쿼리가 2.6의 문서를 반환하지 않는 이상한 상황이 있습니다.

문제의 쿼리

var dbSearch = { 
    created: { $gte: new Date(1409815194808) }, 
    geolocation: { 
     $geoWithin: { 
      $center: [ [ 4.895167900000001, 52.3702157 ], 0.1125 ] 
     } 
    } 
}; 

해당 모음에있는 다음 (관련) 인덱스 :

: 몽고 2.6에 대해이 쿼리를 실행

{ "v" : 1, "key" : { "created" : -1 }, "name" : "createdIndex", "ns" : "prod.search", "background" : true } 
{ "v" : 1, "key" : { "geolocation" : "2d", "created" : -1 }, "name" : "geolocationCreatedIndex", "ns" : "prod.search" } 

쿼리가 로그 다음을 제공합니다

{ created: { $gte: new Date(1409815194808) }, geolocation: { $geoWithin: { $center: [ [ 4.895167900000001, 52.3702157 ], 0.1125 ] } } } 
planSummary: IXSCAN { created: -1 } ntoreturn:0 ntoskip:0 keyUpdates:0 numYields:0 locks(micros) r:8196 nreturned:0 reslen:20 8ms 

node-mongodb-native mo를 사용하여 NodeJS를 사용하여 데이터베이스에이 쿼리를 실행하려고합니다. 노새.

검색 필드 (created 또는 geolocation) 중 하나를 제거하면 쿼리가 2.4 및 2.6에서 올바른 결과를 생성합니다.

: 몽고에 2.6 쿼리 설명

> db.search.find({created: { $gte: new Date(1409815194808) }, geolocation: {$geoWithin: {$center: [ [ 4.895167900000001, 52.3702157 ], 0.1125 ] } } }).explain() 
{ 
    "cursor" : "GeoBrowse-circle", 
    "isMultiKey" : false, 
    "n" : 321, 
    "nscannedObjects" : 321, 
    "nscanned" : 321, 
    "nscannedObjectsAllPlans" : 321, 
    "nscannedAllPlans" : 321, 
    "scanAndOrder" : false, 
    "indexOnly" : false, 
    "nYields" : 0, 
    "nChunkSkips" : 0, 
    "millis" : 69, 
    "indexBounds" : { 
     "geolocation" : [ ] 
    }, 
    "lookedAt" : NumberLong(8940), 
    "matchesPerfd" : NumberLong(8538), 
    "objectsLoaded" : NumberLong(8538), 
    "pointsLoaded" : NumberLong(0), 
    "pointsSavedForYield" : NumberLong(0), 
    "pointsChangedOnYield" : NumberLong(0), 
    "pointsRemovedOnYield" : NumberLong(0), 
    "server" : "ubmongo24.local:27017" 
} 

: 조합 (위의 게시 등) 추가로 2.6

편집에 아무런 결과가 몽고에 2.4 쿼리 설명 정보

를 요구되지 제공

+0

최신 노드 몽고 드라이버가 있습니까? – joao

+0

2.4 및 2.6에 대한 설명을하고 결과를 질문에 추가 할 수 있습니까? 참고로, 2.6의 복합 지리 색인에 대한 공개 문제가 있습니다 (https://jira.mongodb.org/browse/SERVER-14264). 귀하의보고 결과와 동일 –

+0

@ AdamComerford 설명 정보를 게시물에 추가했습니다. 추천 한 항목이 관련성이있는 것으로 보입니다. – Whyhankee

답변

1

Explain 출력에 따라 문제는 쿼리 최적화 프로그램 (extens 깔끔하게 2.6에서 정비 - 주로 더 나은,하지만 그것은 새로운 가장자리 경우가 있음을 의미합니다). 하나의 필드를 사용 createdIndex 화합물 지수는 2.4

에서 사용되는 것이 아니라 그 당신의 문제를 해결하는 경우 2.6 (.hint({ "geolocation" : "2d", "created" : -1 }))에서 geolocationCreatedIndex 인덱스를 암시 시도하고 볼 - 그것은 기본적으로 대신 createdIndex을 선택하고 따라서 사용하지 않는 지리 정보 색인

+0

$ hint를 사용하여이 케이스에 대한 적절한 결과를 얻었습니다. 그러나이 점에서 Mongo 2.6으로 이동하는 것이 주저합니다. '적절한 인덱스를 선택하는 것'은 매우 중요한 DB 기능이며이 시점에서 그것을 신뢰하기를 꺼립니다. 앞으로 나아갈 길에 대한 조언을 해 줄 수 있습니까? - MongoDB에 버그로보고해야합니까? - 적절한 인덱스 사용을 위해 모든 쿼리를 실제로 확인해야합니까? - 2.6에서 적절한 색인을 선택할 기회를 늘릴 수있는 색인 '우수 사례'가 있습니까? 감사합니다. – Whyhankee

+0

확실히 말하기는 힘들지 만, 커널 엔지니어가 체중을 측정해야 할 수도 있습니다. 따라서 Jira 문제는 그들이 한 번 살펴보아야 함을 의미합니다.설명하자면, 옵티마이 저가 "옳은"일을하고 있다고 생각합니다. 기술적으로 $ geowithin은 지오 인덱스가 필요하지 않습니다. 생성 된 인덱스가 처음 101 워드 프로세서를 반환하므로 옵티마이 저가 선택합니다. 암시하거나 필터 (http://docs.mongodb.org/manual/core/query-plans/#index-filters)를 사용하면 잠정적으로 해결할 수 있지만이 유형의 쿼리에 대한 최적화 프로그램을 조정할 가치가 있습니다. 일반 –