2014-10-02 99 views
0

我遇到了麻煩Mongoengine的地理空間查詢工作。我有一個User mongoengine類與一個叫cached.geoLoc場這是mongoengine型PointField()的。如果我打電話麻煩mongoengine和地理空間查詢

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

然後它返回答案。但是,如果我想結果限制在有限的範圍,並呼籲:

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

然後我得到一個錯誤: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

我使用MongoEngine版本0.8.7和MongoDB 2.4可能是什麼問題?

回答

2

我在這裏尖叫錯誤。

如果我試試這一套類似的數據與類似以下內容:

class Geo(Document): 
    loc = PointField() 


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

然後發給的MongoDB結果查詢是這樣的:

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

的問題作爲$maxDistance錯誤的地方。

使用原始pymongo驅動程序的命令發出正確的查詢表單工作正常:

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

而且主要是因爲我們正在發行的$maxDistance修改的地方應該是它是$near操作參數「中」。

文件中的錯誤。但是,您可以使用直接語法來獲得結果作爲解決方法,直到出現修復。

+0

好吧,我將提交一個錯誤。但是與此同時,你知道是否可以使用直接語法,然後從結果中構造一個MongoEngine對象嗎?使用直接語法只是返回一個標準字典。 – 2014-10-03 13:51:40

+0

@ J-bob老實說,我從來沒有嘗試過。但基本的概念是,構造函數的「參數」應該與返回的值相同。因此,傳遞「原始」對象響應並「投射」到您希望訪問該類上的其他方法的類的類型應該不是問題。在其他語言實現中完成它。但更多的是一個MongoEngine的顧問,而不是一個普通的用戶。 – 2014-10-03 14:05:40

+0

對於一個變通方法,仍可以讓你MongoEngine對象,我想通了,我可以用MongoEngine的'__raw__'參數('User.objects(__ __原料= {<<原料pymongo語法這裏>>}'),這將返回MongoEngine對象。 – 2014-10-15 16:17:16