‫Bon retour après une longue conférence où
‫nous avons recherché des documents de
‫visite à une
‫certaine distance d'un certain point à l'aide de requêtes géospatiales.
‫Maintenant, dans cette leçon, utilisons l'agrégation géospatiale afin de calculer les
‫distances de tous les
‫circuits à partir d'un certain point.
‫Donc, comme avant, commençons par définir la
‫route afin de savoir avec quelles
‫données nous allons travailler.
‫Donc routeur. route; à ce stade, je
‫vais l'appeler simplement des distances, puis les données dont nous avons
‫besoin sont la latitude et la
‫longitude du point où
‫se trouve actuellement l'utilisateur, donc
‫dans notre exemple précédent, c'était LA, puis
‫permettons également
‫à l'utilisateur à nouveau pour spécifier l'unité.
‫Ensuite, ici, la fonction de gestionnaire de route.
‫Maintenant, cette
‫fois ici, nous n'avons pas besoin du paramètre
‫de distance, comme nous
‫l'avions ici, car nous n'allons pas rechercher un certain rayon.
‫Nous allons vraiment calculer la distance entre
‫un certain point et tous les circuits que
‫nous avons dans notre collection.
‫Le gestionnaire est donc à tourController,
‫et il s'appellera getDistances.
‫Nous ne l'avons pas encore, alors créons-le.
‫CatchAsync, puis bien sûr marquer la fonction comme async aussi
‫parce que nous savons déjà que nous
‫allons utiliser le pipeline d'agrégation,
‫et donc au moment où nous
‫utiliserons une attente.
‫Le début de cette fonction est en fait assez similaire à
‫celui de getToursWithin, alors allons-y et copiez simplement
‫tout ce code.
‫Nous avons des unités similaires, nous devons également obtenir la latitude
‫et la longitude, et nous
‫devons également créer cette erreur au cas
‫où il n'y aurait pas de latitude ou de longitude.
‫Celui-ci ici ne s'applique pas, et
‫nous n'avons pas non plus la distance.
‫Faisons maintenant le calcul proprement dit.
‫Comme avant, pour faire des
‫calculs, nous utilisons toujours le pipeline d'agrégation.
‫Et rappelez-vous, cela s'appelle sur le modèle lui-même.
‫Alors Tournée. agrégat.
‫Attendons ensuite cela et enregistrons-le dans
‫la variable distances.
‫Alors ici, rappelez-vous, nous avons passé un
‫tableau avec toutes les étapes du pipeline d'agrégation
‫que nous voulons définir.
‫Maintenant, pour l'agrégation géospatiale,
‫il n'y a en fait qu'une seule étape,
‫et elle s'appelle geoNear, donc celle-ci.
‫Encore une fois, il s'agit de
‫la seule étape de pipeline d'agrégation géospatiale qui existe réellement.
‫Celui-ci doit toujours être le premier dans le pipeline.
‫Gardez donc cela à l'esprit que
‫geoNear doit toujours être la première étape.
‫Une autre chose qu'il est également très important de
‫noter à propos de geoNear est qu'il
‫nécessite qu'au moins un de
‫nos champs contienne un index géospatial.
‫En fait, nous l'avons déjà fait
‫auparavant, alors jetons à nouveau un coup d'œil.
‫Notre point de
‫départ contient déjà cet index géospatial 2dsphere.
‫Puisque nous utilisons ce startLocation
‫pour calculer les
‫distances, eh bien, c'est parfait.
‫S'il n'y a qu'un seul champ
‫avec un index géospatial, cette étape geoNear ici utilisera
‫automatiquement cet index pour effectuer le calcul.
‫Mais si vous avez plusieurs champs avec des index géospatiaux,
‫vous devez utiliser le paramètre keys afin
‫de définir le champ
‫que vous souhaitez utiliser pour les calculs.
‫Gardez donc cela à
‫l'esprit, mais encore une fois, dans
‫ce cas, nous n'avons qu'un seul champ, et donc automatiquement,
‫ce champ startLocation va être utilisé pour faire ces calculs.
‫Alors, de quoi avons-nous besoin pour passer dans geoNear ?
‫Eh bien, nous devons d'abord spécifier la propriété near,
‫et near est le point à partir duquel calculer les distances.
‫Donc toutes les distances seront calculées à partir de ce
‫point que nous définissons ici, puis tous les emplacements de départ.
‫Donc ce point proche ici est bien
‫sûr le point que nous passons dans cette fonction
‫avec cette latitude et cette longitude.
‫Maintenant, nous devons spécifier ce point ici en tant que geojson, c'est
‫donc comme nous l'avons fait
‫auparavant, où nous devons spécifier le type en
‫tant que Point, puis spécifier la propriété des coordonnées.
‫Et comme toujours, la première coordonnée ici est
‫la longitude, puis la seconde, la latitude.
‫Et multiplions les deux par un, simplement
‫pour le convertir en nombres.
‫C'est donc le premier champ obligatoire, near, et le
‫second est la propriété du champ distance.
‫Donc distanceField, et donc c'est le nom
‫du champ qui sera créé
‫et où toutes les distances calculées seront stockées.
‫Appelons simplement cela une distance.
‫En fait, c'est ça.
‫Ce sont tous les champs
‫qui sont obligatoires dans cette étape geoNear.
‫Et bien sûr, nous pouvons ajouter d'autres étapes ici, et
‫nous allons en fait le faire un peu plus
‫tard, mais pour l'instant tout ce
‫que je veux faire, c'est vraiment voir les résultats de ce travail.
‫Copions à nouveau ce résultat ici, envoyant ainsi ces
‫résultats, et ici, envoyons ensuite les distances, et aussi celle-ci
‫dont nous n'avons
‫pas besoin.
‫Alors, nous sommes prêts à commencer.
‫Gardez à l'esprit qu'à ce stade, nous n'avons pas utilisé l'unité, mais
‫ne vous inquiétez pas pour cela.
‫Nous allons le faire dans une seconde,
‫mais encore une fois, je veux d'abord vraiment voir cela fonctionner.
‫N'oubliez pas que l'itinéraire est maintenant des
‫distances, alors copions simplement celui-ci ici.
‫En fait, je vais l'enregistrer aussi,
‫donc dans les tournées.
‫Disons que vous obtenez des visites dans un rayon.
‫Ceci s'appelle ici les distances, et nous n'avons pas
‫ceci et pas cela non plus.
‫Donc juste les coordonnées, puis à nouveau l'unité.
‫Jetons un coup d'œil, et nous allons maintenant obtenir cette erreur.
‫Rappelez-vous comment nous avons dit
‫que geoNear doit toujours être la première étape d'un
‫pipeline, mais si vous
‫regardez maintenant le code, vous pourriez penser qu'en fait notre étape geoNear
‫est actuellement la première étape de notre pipeline.
‫Parce qu'ici, on dirait vraiment que c'est le cas, n'est-ce pas ?
‫Il n'y a rien avant cela, et alors pourquoi obtenons-nous
‫cette erreur que geoNear n'est pas la première étape du pipeline ?
‫En fait, cela m'a pris un peu de temps pour comprendre cela parce que cela a
‫quelque chose à voir avec un morceau de code que nous
‫avons écrit il y a longtemps.
‫C'est ici dans le modèle de
‫tournée, et si nous descendons ici, je pense.
‫Ici, nous avons ce middleware d'agrégation, et rappelez-vous que
‫cela a fait en fait toujours ajouter cette étape de match
‫ici avant toutes les autres étapes, et en fait nous avons
‫cette console. connectez-vous
‫ici et vous pouvez donc voir
‫l'intégralité du pipeline ici.
‫Et donc vous voyez que nous avons
‫d'abord le match, puis la
‫phase geoNear ici, en fait seulement comme deuxième étape.
‫Il est donc logique que nous obtenions cette erreur.
‫Maintenant, nous pourrions aller de l'avant et changer ce
‫middleware ici et dire que si geoNear est le premier
‫opérateur dans le pipeline, alors ne le faites tout simplement pas ici.
‫Mais c'est un peu trop de travail pour ce cas d'utilisation, donc tout ce
‫que je vais faire est de me débarrasser de ce middleware.
‫Alors faites une sauvegarde, et maintenant essayons à nouveau.
‫Maintenant, nous obtenons nos tournées, et maintenant il devrait y
‫avoir ce champ de distance sur eux.
‫Alors cherchons cela, et en effet, c'est parti.
‫Donc la distance, et puis ce nombre énorme ici.
‫C'est ce grand nombre,
‫car en fait il est calculé
‫en mètres, donc ce résultat est en
‫mètres, donc convertissons tout d'abord celui-ci en kilomètres.
‫Plus tard, nous le convertirons également en miles, car rappelez-vous
‫que nous avons spécifié l'unité en miles, mais pour l'instant, la
‫solution la plus simple est
‫de la convertir en kilomètres, car tout
‫ce que nous avons
‫à faire pour cela est de simplement la diviser par 1000.
‫Et puis aussi ce
‫que je veux faire c'est n'avoir vraiment que les distances,
‫et le nom des tours.
‫Alors débarrassez-vous de tous les autres encombrements que nous avons ici
‫et concentrez-vous vraiment uniquement sur les distances elles-mêmes.
‫Pour cela, comme vous vous en
‫souvenez peut-être, nous pouvons utiliser l'étape du projet.
‫Ajoutons donc cela ici comme deuxième étape.
‫Donc projetez, puis en gros les noms des champs que
‫nous voulons conserver.
‫C'est donc la distance, et nous avons donc défini cela un à
‫un, en disant que nous voulons le garder, puis aussi
‫le nom pour que nous sachions réellement de quelle tournée nous parlons.
‫Avec cela, nous nous débarrassons de toutes
‫les autres données et divisons maintenant la distance par
‫1000 afin de convertir ces mètres en kilomètres.
‫En fait, c'est très facile
‫à faire, car dans une étape geoNear, nous pouvons en
‫fait spécifier la propriété du multiplicateur de distance.
‫Donc distanceMultiplier, et donc ici on peut spécifier un nombre qui va
‫ensuite être multiplié par toutes les distances.
‫Ici, nous spécifions 0. 001, et c'est donc exactement la même chose
‫que de diviser par 1000.
‫Alors testons notre résultat ici maintenant.
‫Et ce calcul prend apparemment un certain temps, mais
‫maintenant nous y voilà.
‫Alors maintenant, vous obtenez ce joli résultat ici en kilomètres.
‫Comme vous le voyez, le Sports Lover est le circuit le plus
‫proche de l'emplacement de Los Angeles que nous avons marqué.
‫Ce n'est donc qu'à 64 kilomètres, ce qui
‫devrait être quelque chose comme 40 milles.
‫Mais encore une fois, nous allons faire cette conversion dans une seconde.
‫Pour l'instant, je veux juste revenir à cette carte et à cette
‫boussole et voir si cela a vraiment du sens.
‫Nous sommes donc toujours là, et nous avons toujours
‫notre carte des emplacements de départ.
‫Maintenant, le
‫problème ici est que nous ne pouvons pas vraiment cliquer sur
‫l'un de ces points et voir ce qu'ils sont.
‫Mais dessinons à nouveau un cercle rapide juste pour
‫voir quelles sont les tournées les plus
‫proches et si elles correspondent à celles de notre sortie.
‫Donc c'est un peu ici,
‫je crois, et incluons donc ces cinq tournées ici.
‫Leurs noms sont donc The Park Camper, Snow Adventurer, Wine
‫Taster, Sports Lover et Star Gazer, et maintenant,
‫quand nous venons ici, ce
‫sont en fait les cinq premiers.
‫Amateur de sport, campeur de parc,
‫dégustateur de vin, Star Gazer et aventurier des neiges.
‫Alors celui qui est vraiment proche est le Sports Lover,
‫et le suivant est le Park Camper
‫et le Wine Taster.
‫Celui-ci ici va être le Park Camper,
‫qui, je crois, commence à Las
‫Vegas, donc cela
‫a du sens, puis un troisième
‫est ici, The Wine Taster près de San Francisco.
‫Donc cette distance de 800 kilomètres je pense, ou qu'est-ce que
‫c'était ?
‫Oui, 600 kilomètres, ça a du sens.
‫Donc, quelque chose de près de 400 milles ici.
‫Et en parlant de miles, faisons
‫cette conversion maintenant.
‫Faisons quelque chose de similaire à ce que nous avons
‫fait auparavant, donc testons l'unité.
‫Créons une variable multiplicatrice, encore
‫une fois un opérateur ternaire ici,
‫donc s'il s'agit de miles, quel devrait être notre multiplicateur ?
‫Eh bien, cherchons en fait
‫très simplement sur Google ce qu'est un mètre en miles.
‫Un mètre en milles, et Google nous donne
‫généralement une assez belle réponse, et c'est effectivement le cas.
‫Donc, si c'est un mètre, alors tout ce que nous avons à
‫faire est de vraiment multiplier notre résultat en mètres
‫avec ce nombre.
‫Alors copions-le ici, et revenons en arrière, et cela devrait donc
‫être notre multiplicateur au cas où
‫l'unité serait le mètre, ou en fait au cas où ce serait le mille.
‫Et au cas où ce serait des
‫mètres, alors c'est ce 0. 001 que nous utilisions auparavant.
‫Nous ne le voulons
‫pas en mètres, car ce n'est pas vraiment une unité lisible.
‫Au lieu de cela, nous le voulons en kilomètres.
‫Alors maintenant, nous pouvons aller de l'avant et utiliser la
‫variable multiplicatrice ici, lui donner une sauvegarde et l'essayer.
‫Jetez donc un œil à ce que nous avons ici
‫en kilomètres, donc à partir du résultat précédent, qui est de 64.
‫Cela devrait être d'environ 40 milles, alors envoyons-le, et
‫c'était assez proche.
‫Donc 40. 2 milles en effet.
‫Et ce sont donc nos circuits
‫les plus proches, et le plus éloigné est le City Wonderer, qui, je pense, commence à
‫New York ou quelque chose du genre, et donc
‫à plus de 2400 miles de L. UNE.
‫Si nous le réglons ensuite ici en kilomètres, il
‫devrait revenir à la valeur que nous
‫avions auparavant.
‫Revenons aux miles car je
‫sais que la plupart des gens qui regardent ce cours
‫viennent des États-Unis. S. , et donc là-bas,
‫ils utilisent des miles au lieu de kilomètres.
‫Enregistrons donc cela ici également dans notre
‫collection pour obtenir les distances aux visites à partir d'un point.
‫Voilà, voilà qui conclut cette conférence, et
‫c'est tout ce que j'avais à vous montrer sur les données géospatiales.
‫Donc, cette vidéo et la dernière auraient dû
‫vous donner un très bon aperçu de
‫la façon de travailler avec des données géospatiales dans MongoDB.
‫Et comme je l'ai déjà dit, il y a une tonne
‫de possibilités de choses que vous pouvez faire dans vos propres
‫applications en utilisant ce type de données.