2017-01-19 3 views
1

Я пытаюсь использовать Еву запрос к базе данных MongoDB с оператором агрегации geoNear, но я получаю следующее при использовании агрегированных переменных:Использовать переменные в geonear агрегатор в Еве Python с MongoDB

«OperationFailure: команда geoNear не удалось: {оК: 0.0, ErrMsg: " 'рядом с' поле должно быть точка", код: 17304, кодовое название: "Location17304"}»

агрегирование конечная точка устанавливается в settings.py следующим :

geoAggr = {'datasource':{ 
    'source':'geo', 
    'aggregation': { 
     'pipeline': [ 
      {'$geoNear':{ 
       'near': {'type':'Point', 'coordinates':['$lon', '$lat']}, 
       'distanceField':'distance', 
       'maxDistance':'$maxDistance', 
       'spherical': True, 
       'query':{ 
        'recentAnalyses.KeywordCombinationAll /300 v1':{ 
         '$exists': True 
        } 
       } 
      }} 
      ] 
     } 
}} 

Выполняется запрос POSTMAN с запросом GET на адрес xxx.xxx.xxx.xxx:5000/geoAggr?aggregate={"$lon":"10.5","$lat":"10.5","$maxDistance":100000}.

Если $lon и $lat заменены жестко закодированными значениями, агрегатор работает отлично, поэтому, похоже, это связано с тем, как переменные помещаются в агрегатор. Моя первая мысль заключалась в том, что числа могут быть интерпретированы как строки, но параметр $maxDistance работает так, как ожидалось.

Почему это не работает с переменными?

+0

'' 'зарезервировано в MongoDB. Можете ли вы изменить имя переменных и попробовать? – Veeram

+0

Переменные фактически заменяются на Eve до того, как они добираются до mongo (я уже пытался их изменить, это было основано на примере в документах Eve http://python-eve.org/features.html#mongodb-aggregation-framework). Я нашел решение сейчас, спасибо за ваше предложение, хотя – gfkeith

ответ

1

Похоже, что переменные внутри массивов не заменяются (я не уверен, что это правильно во всех случаях, но именно в этом), что имеет смысл.

Замена 'coordinates':['$lon', '$lat'] на 'coordinates':'$coords' и доступ с помощью xxx.xxx.xxx.xxx:5000/geoAggr?aggregate={"$coords":[10.5,10.5],"$maxDistance":100000} работ.

Смежные вопросы