Почтальон (и канун python), предоставляющий разные результаты для одного и того же запроса при выполнении в mongodb

Я разрабатываю очень легкий 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'}}]}
                            },

                    }

person SAB    schedule 11.09.2017    source источник
comment
Не использую его сам, но уверен, что после быстрого прочтения документации на самом деле вы должны указать конвейер в конфигурации, а не как часть URL-адреса. Вместо этого параметры URL-адреса используются для замены переменных. Поэтому было бы логично настроить конвейер на конечной точке, а не передавать весь конвейер в качестве параметра.   -  person Neil Lunn    schedule 11.09.2017
comment
Спасибо, Нил, но по-прежнему возникает та же проблема с игнорированием запроса и возвратом всех документов.   -  person SAB    schedule 11.09.2017


Ответы (1)


Вроде работает, хотя и игнорирует схему... но думаю, это другой вопрос.

Конвейер агрегации перенесен в элемент и удалены квадратные скобки вокруг «$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'}}]}
                            },

                    }
person SAB    schedule 11.09.2017