MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Les appels Mongoose à geoNear avec des points GeoJSON en tant que paramètres de requête ne fonctionnent pas

Le problème était l'utilisation incorrecte de maxDistance. L'expression suivante a fonctionné.


Branch.geoNear({type: "Point", coordinates: [0.0776590, -33.7797590]}, {
  spherical: true, 
  maxDistance: 1 / 6378137, 
  distanceMultiplier: 6378137
})
  .then(function (doc) {
    console.log(doc);
    process.exit();
  });


Mongoose: branches.ensureIndex({ location: '2dsphere' }) { safe: undefined, background: true }  
Mongoose: branches.geoNear(0.077659) -33.779759 { distanceMultiplier: 6378137, lean: true, maxDistance: 1.567855942887398e-7, spherical: true } 
[]

Maintenant, la requête découvre correctement que les deux documents de la collection ne sont pas à moins d'un mètre de l'emplacement interrogé. Interroger un emplacement plus proche de chez nous nous donne également les résultats attendus.


Branch.geoNear({type: "Point", coordinates: [153.027117, -27.468515]}, {
  spherical: true, 
  maxDistance: 1 / 6378137, 
  distanceMultiplier: 6378137
})
  .then(function (doc) {
    console.log(doc);
    process.exit();
  });

Mongoose: branches.ensureIndex({ location: '2dsphere' }) { safe: undefined, background: true }  
Mongoose: branches.geoNear(153.027117) -27.468515 { distanceMultiplier: 6378137, lean: true, maxDistance: 1.567855942887398e-7, spherical: true } 
[ { dis: 0.0026823704060803567,
    obj: 
     { name: 'A',
       _id: 533200e49ba06bec37c0cc22,
       location: [Object],
       __v: 0 } } ]

La solution ?

La documentation MongoDb de geoNear indique que si vous utilisez un objet geoJSON, maxDistance doit être en mètres et en radians si vous utilisez des paires de coordonnées.

C'est soit faux, soit ma compréhension est fausse.

Comme vous pouvez le voir ci-dessus, plutôt que de spécifier 1 mètre pour maxDistance, il est fourni en radians.