2012-07-26 5 views
1

스프링 데이터의 니어 쿼리 작업을 사용하여 수행하는 쿼리가 비슷합니다. 모든 것이 대부분 잘 작동합니다. 그러나, 나는 여러 테스트 기계와 생산 기계에 관한 코드를 가지고있다. 쿼리는 일부 테스트 시스템에서 작동하지만 프로덕션 시스템 및 테스트 시스템 중 하나에서 새로 생성 된 개체에 대한 결과를 반환하지 않습니다. mongodb 컬렉션을 작동하지 않는 컴퓨터에 놓은 다음 동일한 코드를 사용하여 새 문서를 삽입하고 컬렉션을 다시 만들면 쿼리가 다시 작동하기 시작합니다. 내 질문은; 무엇이 이런 유형의 행동을 일으킬 수 있습니까? 클래스에 새로운 변수를 추가하면 쿼리 근처의 mongodb가 실행을 멈출 수 있습니까? 이미 존재하는 것과 다른 변수를 가진 컬렉션에 문서가 추가되면 문제가 발생할 수 있습니까? 프로덕션 환경에서이 문제를 해결하기 위해 컬렉션을 삭제할 수는 없습니다. 내 mongodb 코드가 계속 작동 할 수 있도록 mongodb 콜렉션의 데이터를 일관성있게 유지하는 것에 대해 빠진 것이 있습니까?MongoDB 쿼리 가까운 이상한 동작

mongoTemplate 코드 :

Point point = new Point(locationAsDoubleArray[0],locationAsDoubleArray[1]); 

    NearQuery query = NearQuery.near(point.getX(),point.getY()).spherical(true).maxDistance(maxDistance,Metrics.MILES).distanceMultiplier(Metrics.MILES).query(regularQuery);//maxDistance(new Distance(radius,Metrics.MILES)); 


    GeoResults<CalendarEvent> results = ((MongoOperations)mongoTemplate).geoNear(query, CalendarEvent.class); 

JSON 형식으로 반환되어야 문서 :

{ "_class" : "com.eatmyfish.services.custom.CalendarEvent" , "_id" : { "$oid" : "5011c5cf51527fce6c4d2a00"} , "_keywords" : [ "test" , "search" , "function" , "test" , ""] , "address1" : "221 East 5th Street" , "address2" : "" , "allDay" : false , "categories" : [ 14] , "city" : "Saint Paul" , "clientId" : 109 , "clientProductId" : 962 , "color" : "#003666" , "createUser" : "peterson.dean" , "description" : "test" , "end" : "2012-07-26 14:00:00" , "endDate" : { "$date" : "2012-07-26T19:00:00.000Z"} , "externalLink" : "<a href='http://'>More Info</a>" , "geoLocation" : [ -93.0875195 , 44.9490055] , "latitude" : 0.0 , "location" : "221 East 5th Street Saint Paul,MN 55101 " , "locationManuallyEntered" : false , "locationName" : "My Cubicle" , "longitude" : 0.0 , "moreInfoLink" : "<a href='http://localhost:8080/posts/list/3150.page'>More Info</a>" , "note" : "" , "privateEventIn" : "N" , "restFormattedAddress" : "221+East+5th+Street+Saint+Paul,+MN+55101" , "start" : "2012-07-26 04:00:00" , "startDate" : { "$date" : "2012-07-26T09:00:00.000Z"} , "state" : "MN" , "title" : "Test Search Function" , "topicId" : 3150 , "url" : "http://localhost:8080/posts/list/3150.page" , "zip" : "55101"} 

코드는 다르게이 실행되는 시스템에 따라 작동합니다. 내 항아리 파일 등이 각 기계에서 동일하다는 것을 확인했습니다. 쿼리가 실패하기 시작하면 쿼리가 작동하도록 만드는 유일한 방법은 컬렉션을 삭제하고 다시 시작하는 것입니다. 그러나 언제 또는 무엇이 쿼리가 작동을 멈추게하는지 확신하지 못합니다. 나는 그 코드가 문제라고 생각하지 않는다. 데이터 정리에 대해 모르는 관리 작업이있을 수 있습니다. 나는 행운없이 수리 명령을 이미 사용했다.

+0

안전하게 쓰고 있습니까? 새 문서에 대한 쿼리를 시작할 때 삽입이 완료되지 않았습니까? –

+0

나는 그렇지 않습니다. 인서트가 완료되었습니다. 전체 컬렉션을 삭제하고 서버를 시작하고 새 문서를 삽입하면 방금 삽입 한 문서에서 다시 쿼리가 시작됩니다. 쿼리는 일정 시간 동안 존재했던 콜렉션을 삭제하기 전에 삽입되고 커밋 된 문서에서는 작동하지 않습니다. 이러한 컬렉션은 컬렉션의 문서에 추가되는 필드를 포함하여 코드에 대한 몇 가지 업데이트를 거쳤습니다. –

+0

더 많은 정보 없이는 아무도 무슨 일이 일어날 지 짐작할 수 없습니다. 반환해야하는 반환되지 않은 문서의 예제 나 실행중인 쿼리 등을 게시 할 수 있습니까? –

답변

2

나는 오래/위도 순서가 반대 인 일부 오래된 항목이 있습니다. 이로 인해 가까운 검색어가 모두 실패했습니다. 역순으로 약간의 long/lat 값을 갖는 것은 이상하게 여겨집니다. 여전히 그게 원인입니다. 역순으로 항목에 대한 long/lats의 순서를 고정하면 쿼리가 다시 작동합니다. 이것을 찾으려면 Spring의 간결한 접근법을 사용하는 대신 java에서 직접 mongodb 명령을 작성하고 사용해야했습니다. 디버깅 중에 명령의 반환 값을 보면 위도에 대한 잘못된 값이 있다는 오류 메시지가 실제로 표시됩니다. 이러한 오류는 Spring의 근거리 질의 작업을 사용하여 반환되지 않았습니다. Spring의 부적절한 오류 메시지는이 버그를 추적하기가 매우 어려웠습니다.

+1

봄 mongo-db 오류 처리에 +1. 이런 종류의 오류가 발생하면 예외가 발생하는 것이 좋습니다. –