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'}}]}
},
}
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. –
Merci Neil, mais toujours le même problème de la requête ignorée et tous les docs retournés – SAB