2017-09-11 10 views
1

Je développe une API très légère en utilisant python eve, qui accède à une base de données mongodb. Chaque document dans la base de données a un champ geom et il y a un index de sphère 2d sur ce champ.Postman (et python eve) fournissant différents résultats à la même requête quand fait dans mongodb

Quand je lance cette requête dans mongo cela fonctionne parfaitement et très rapidement

db.api.aggregate({"$geoNear": {"near": {"type": "Point", "coordinates": [-1.11, 51.69]}, "distanceField": "distance", "maxDistance": 100, "num": 2, "spherical": "true"}}).pretty() 

Mais quand je lance cela dans postman il retourne juste tout et ne tient pas compte de la requête

http://localhost:8090/data?aggregate={"$geoNear": {"near": {"type": "Point", "coordinates": [-1.11, 51.69]}, "distanceField": "distance", "maxDistance": 100,"num": 2,"spherical": "true"}} 

J'ai base schéma mis en place dans Eve, qui fonctionne en partie. Il renvoie uniquement le _id mais pas le champ de distance créé dans le cadre de la requête. Bien que je cours sur la supposition que cela fonctionnera une fois que j'ai la syntaxe pour le facteur correct.

api_shema = {'_id': {'type': 'string'}, 
         'distance': {'type': 'string'} 
         } 

J'ai aussi cet objet mis en place

line_info_item = {'item_title': 'line_info', 
         'resource_methods': ['GET'], 
         'schema': api_shema, 
         'datasource': { 
          'source': 'api', 
          'filter': {'_type': 'line'} 
          } 
        } 

Enfin, le domaine suivant est ajouté

DOMAIN = {'line_info': line_info_item} 

Toute aide à la requête de postier, ou si vous remarquez des erreurs dans le reste , serait très apprécié.

EDIT:

Je mis en place le pipeline sur le point de terminaison selon la réponse de Neil ci-dessous, mais il est encore en ignorant la requête et retourner tous.

DOMAIN = {'line_info': line_info_item, 
      'aggregation': { 
       'pipeline': [{ 
        "$geoNear": { 
         "near": { 
          "type": "Point", 
          "coordinates": ["$coords"] 
         }, 
         "distanceField": "distance", 
         "maxDistance": "$maxDist", 
         "num": 10, 
         "spherical": "true" 
        } 
       }] 
      } 
     } 

L'URL de requête est postier

http://localhost:8090/data?aggregate={"$maxDist":500, "$coords":[-1.477307, 50.931700]} 

EDIT

Trier de travailler, bien ignorant le schéma ... mais devine qui est une autre question.

Moved le pipeline d'agrégation dans l'élément et de supprimer les crochets autour de « $ » 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'}}]} 
          }, 

        } 
+2

Ne pas utiliser moi-même, mais à peu près sûr d'une [lecture rapide de la documentation] (http://python-eve.org/features.html#mongodb-aggregation-framework) vous êtes en fait censé spécifier "pipleline" dans la configuration, et non dans le cadre de l'URL. Les paramètres d'URL semblent être utilisés dans "variable substitution" à la place. Il semble donc logique de configurer le pipeline sur le noeud final, plutôt que de passer en paramètre dans l'ensemble du pipeline. –

+0

Merci Neil, mais toujours le même problème de la requête ignorée et tous les docs retournés – SAB

Répondre

0

Trier de travailler, bien ignorant le schéma ... mais devine qui est une autre question.

Moved le pipeline d'agrégation dans l'élément et de supprimer les crochets autour de « $ 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'}}]} 
          }, 

        }