3 votes

le champ proche doit être ponctuel

Je suis en train de construire une api en utilisant express et mongoose. J'ai une collection de revues qui a un champ de localisation qui stocke geoJSON. J'essaie d'interroger ma collection d'avis en utilisant la méthode suivante agrégat y $geoNear .

Voici la partie pertinente de mon ReviewSchema :

location: { 
    type: { 
      type: String, 
      default: 'Point'
    },
    coordinates: { 
      type: [Number] 
    } 
  }

J'ai également ajouté un 2dsphère l'index :

ReviewSchema.index({ location: '2dsphere' });

Je suis capable d'interroger avec succès la collection en utilisant trouver y $nearSphere :

router.get('/:longitude/:latitude/:dist', (req, res) => {
  Review.find({
    location: {
     $nearSphere: {
       $geometry: {
         type: 'Point',
         coordinates: [req.params.longitude, req.params.latitude]
       },
       $maxDistance: req.params.dist * 1609.34
     }
   }
  })
  .then(reviews => res.json(reviews))
});

Cependant, lorsque j'essaie d'utiliser l'agrégat et $geoNear, je reçois une erreur :
le champ proche doit être ponctuel

Voici la route avec la requête :

router.get('/:longitude/:latitude', (req, res) => {
  Review.aggregate([{
     $geoNear: {
       near: {
         type: "Point",
         coordinates: [req.params.longitude, req.params.latitude]
       },
       spherical: true,
       maxDistance: 10 * 1609,
       distanceField: 'distance'
     }
   }])
   .then(reviews => res.json(reviews))
   .catch(err => console.log(err))
});

La syntaxe de ma requête est basée sur la documentation de mongoDB pour $geoNear. Est-ce que je ne l'utilise pas correctement avec mongoose ? Toute aide est la bienvenue !

3voto

Anthony Winzlet Points 10216

Le problème se situe au niveau des coordonnées, qui doivent toujours être numériques, alors que vous les avez indiquées comme suit String

Donc, à la place, convertissez-les en valeurs entières ou flottantes.

Review.aggregate([{
  "$geoNear": {
    "near": {
      "type": "Point",
      "coordinates": [parseFloat(req.params.longitude), parseFloat(req.params.latitude)]
    },
    "spherical": true,
    "maxDistance": 10 * 1609,
    "distanceField": "distance"
  }
}])

0voto

lucygenik Points 262

J'ajoute que les géocoords doivent également être valides, et que la requête est lng,lat - si vous les obtenez à l'envers ou si vous spécifiez simplement une coordonnée invalide, vous obtenez la même erreur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X