Я разрабатываю очень легкий API, используя Python Eve, который обращается к базе данных mongodb. Каждый документ в базе данных имеет поле geom, и в этом поле есть индекс 2d-сферы.
Когда я запускаю этот запрос в монго, он работает отлично и очень быстро.
db.api.aggregate({"$geoNear": {"near": {"type": "Point", "coordinates": [-1.11, 51.69]}, "distanceField": "distance", "maxDistance": 100, "num": 2, "spherical": "true"}}).pretty()
Но когда я запускаю это в почтальоне, он просто возвращает все и игнорирует запрос
http://localhost:8090/data?aggregate={"$geoNear": {"near": {"type": "Point", "coordinates": [-1.11, 51.69]}, "distanceField": "distance", "maxDistance": 100,"num": 2,"spherical": "true"}}
У меня есть базовая схема, настроенная в Еве, которая частично работает. Он возвращает только _id, но не поле расстояния, созданное как часть запроса. Хотя я исхожу из предположения, что это сработает, как только у меня будет правильный синтаксис для почтальона.
api_shema = {'_id': {'type': 'string'},
'distance': {'type': 'string'}
}
у меня тоже этот пункт настроен
line_info_item = {'item_title': 'line_info',
'resource_methods': ['GET'],
'schema': api_shema,
'datasource': {
'source': 'api',
'filter': {'_type': 'line'}
}
}
Наконец, следующий домен добавлен
DOMAIN = {'line_info': line_info_item}
Любая помощь с запросом почтальона или если вы обнаружите какие-либо ошибки в остальном, будет очень признательна.
РЕДАКТИРОВАТЬ:
Я настроил конвейер на конечной точке в соответствии с ответом Нила ниже, но он по-прежнему игнорирует запрос и возвращает все.
DOMAIN = {'line_info': line_info_item,
'aggregation': {
'pipeline': [{
"$geoNear": {
"near": {
"type": "Point",
"coordinates": ["$coords"]
},
"distanceField": "distance",
"maxDistance": "$maxDist",
"num": 10,
"spherical": "true"
}
}]
}
}
URL-адрес запроса почтальона
http://localhost:8090/data?aggregate={"$maxDist":500, "$coords":[-1.477307, 50.931700]}
РЕДАКТИРОВАТЬ
Вроде работает, хотя и игнорирует схему... но думаю, это другой вопрос.
Конвейер агрегации перенесен в элемент и удалены квадратные скобки вокруг «$coords».
river_relate_item = {'item_title': 'line_info_item',
'resource_methods': ['GET'],
'schema': api_shema,
'datasource': {
'source': 'api',
'filter': {'_type': 'line'},
'aggregation': {'pipeline': [{'$geoNear':{'near':{'type': 'point', 'coordinates': '$coords'},'distanceField': 'distance','maxDistance': '$maxDist','num': 1, 'spherical': 'true'}}]}
},
}