2014-10-02 2 views
0

몽고 엔진의 지형 공간 쿼리를 작동시키는 데 문제가 있습니다. 나는mongoengine 클래스와 cached.geoLoc이라는 필드를 가지고 있는데 이는 몽고 엔진 유형 PointField()입니다. 전화 할 경우몽고와 지형 공간 쿼리에 문제가 발생했습니다.

User.objects(cached__geoLoc__near=[100,100]) 

그런 다음 답변을 반환합니다. 내가 제한된 반경 결과를 제한하고 전화를 원한다면 : 나는 문제가 될 수 무엇 MongoEngine 버전 0.8.7 및 MongoDB를 2.4을 사용하고 pymongo.errors.OperationFailure: database error: Can't canonicalize query: BadValue geo near accepts just one argument when querying for a GeoJSON point. Extra field found: $maxDistance: 1000

:

User.objects(cached__geoLoc__near=[100,100], cached__geoLoc__max_distance=1000) 

를 다음 오류가 발생합니다 ?

답변

2

여기에 버그가 있습니다. 나는이 다음과 같은 뭔가 데이터의 유사한 세트를하려고하면

는 : 문제가 $maxDistance 인으로

{ 
    "loc" : { 
     "$near" : { 
      "$geometry" : { 
       "type" : "Point", 
       "coordinates" : [ 3, 6 ] 
      } 
     }, 
     "$maxDistance" : 1000 
    } 
} 

:

class Geo(Document): 
    loc = PointField() 


result = Geo.objects(loc__near=[3,6], loc__max_distance=1000) 

그 후 MongoDB를 발행 결과 쿼리는 이것이다 한정자가 에 잘못되었습니다 장소.

원시 pymongo 드라이버 명령을 사용하여 발행 올바른 쿼리 양식

잘 작동합니다 :

result = Geo._get_collection().find({ 
    "loc": { 
     "$near": { 
      "$geometry": { 
      "type": "Point", 
      "coordinates": [3,6] 
      }, 
      "$maxDistance": 1000 
     } 
    } 
}): 

그리고 대부분은 우리가 $near 운영자 인수 "에서"어떤 있어야 $maxDistance 수정을 발행 때문이다.

버그를 저장하십시오. 그러나 수정이있을 때까지 직접 구문을 사용하여 결과를 해결할 수 있습니다.

+0

좋아, 제가 버그를 제기 할 것입니다. 그러나 그 동안 직접 구문을 사용하고 결과에서 MongoEngine 객체를 생성 할 수 있는지 알고 있습니까? 직접 구문을 사용하면 표준 사전 만 반환됩니다. –

+0

@ J-bob 정직하게도, 나는 결코 시도하지 않고 있었다. 그러나 기본 개념은 생성자에 대한 "인수"가 반환 된 것과 동일한 값이어야한다는 것입니다. 따라서 "원시"객체 응답을 전달하고 해당 클래스의 다른 메소드에 액세스하려는 곳에 노출 된 클래스 유형으로 "캐스트"하는 것이 문제가되어서는 안됩니다. 다른 언어 구현에서이 작업을 수행하십시오. 하지만 MongoEngine 컨설턴트는 일반 사용자보다. –

+0

여전히 MongoEngine 객체를 가져 오는 해결 방법에 대해서는 MongoEngine의'__raw__' 인수 ('User.objects (__ raw __ = {<< 원시 pymongo 구문 >> >>}')를 사용할 수 있음을 알았습니다. 그러면 MongoEngine 객체가 반환됩니다. –

관련 문제