2017-04-13 4 views
1

Mon schéma DB Mongoose ressemble à ceci.Comment obtenir les enregistrements qui contient l'emplacement donné dans son rayon? Mongodb

var blogSchema = mongoose.Schema({ 
blogText: { type: String}, 
location: {type: [Number]}, 
radius : {type: Number}, 
}); 
blogSchema.index({location: 2dsphere}); 
... .. .. ... 

données de l'échantillon ressemble ci-dessous

{ 
"_id" : 58ef3f1919f99e3bb37ce21b, 
"location" : [ 
    77.706106, 
    12.9447252 
], 
"radius" : "4000", 
"blogText" : "News 1 ....."}, 
{ 
"_id" : 58ef3f19b37ce21b19f99e3b, 
"location" : [ 
    77.709979, 
    12.9703882 
], 
"radius" : "1000", 
"blogText" : "Health 1 ....."}, 
{ 
"_id" : 58ef3f1919f99e3bb37ce21b, 
"location" :[ 
    77.7060119, 
    12.9488936 
], 
"radius" : "3500", 
"blogText" : "Lifestyle 1 ....."}, 
{ 
"_id" : 58ef3f1919f99e3bb37ce21b', 
"location" : [ 
    77.709979, 
    12.9703882 
], 
"radius" : "100", 
"blogText" : "Sports....."}, 
{ 
"_id" : 58ef3f1919f99e3bb37ce21b', 
"location" : [ 
    77.706106, 
    12.9447252 
], 
"radius" : "800", 
"blogText" : "Tech ....."} 

Je dois chercher uniquement les blogs qui contient l'emplacement de l'utilisateur sous l'emplacement du blog et le rayon.

Ma requête ressemble à. Lequel récupère les données en fonction de l'emplacement et du rayon de la requête.

db.blogs.find({location: {$geoNear: {$geometry: {type: "Point",coordinates: [77.706106,12.9447252]}$maxDistance: 500,$minDistance: 0}}}} }) 

Merci à l'avance

Répondre

1

modifiés de cette façon answer, cela pourrait fonctionner pour vous.

Utilisez l'agrégat pour pousser des documents dans un pipeline en trois étapes.

1) $geoNear: trouver tous les documents près de vos coordonnées désirées, et retourner un distanceField généré appelé distance.

2) $project: Utiliser le $distance trouvé dans l'étape 1 et soustraire de $radius, stocker comme delta.

3) $match: Filtre tous les delta inférieurs ou égaux à zéro.

db.blogs.aggregate([ 
    { 
    '$geoNear' : { 
     near : [77.706106,12.9447252], 
     distanceField : 'distance', 
     includeLocs: 'location', 
     spherical : true 
    } 
    }, 
    { 
    '$project' : { 
     name : 1, 
     location : 1, 
     delta : { 
     '$subtract' : [ 
      '$radius', 
      '$distance' 
     ] 
     } 
    } 
    }, 
    { 
    '$match' : { 
     delta : { '$gte' : 0 } 
    } 
    } 
]) 
+0

Vous avez raison, j'ai incorrectement changé le nom d'un champ. Il est fixé ci-dessus. –

+0

maintenant ne peut pas $ soustraire un nombredouble d'une chaîne. – Smile

+0

Je n'avais pas réalisé que vous conserviez le rayon en tant que chaîne. Il peut y avoir un moyen de projeter cela aussi, mais la meilleure pratique serait de stocker le rayon comme int ou float. –