Ceci est une exigence très commune où la recherche de filtre géographique et le texte est nécessaire dans un cas d'utilisation qui est malheureusement pas directement pris en charge par mongodb encore. Le code ci-dessous utilise le pilote mongoose, filtre les documents en fonction de l'emplacement (longitude et latitude), puis d'autres filtres basés sur le terme recherché.
var area = {
center: [51, -114], //lng = 51 and lat = -114
radius: 100,
unique: true //this option is deprecated from MongoDB 2.6 on as mongodb no longer returns duplicate results
};
var query = Post.where('loc').within().circle(area) //Step 1: filter based on location
//Step 2: Next filter on the basis of searched text
.where({
$text: {
$search: <searchTerm>
}
}, {
score: {
$meta: 'textScore'
}
})
//Step 3: Filter any document fields that should not be returned in the result
.select({
"val1": 0,
"val2": 0
});
//Execute the query
query.exec(function (err, result) {
if (err) {
//return error in the response
}
//return result object in the response
});
Dans ce code "Post" est un schéma mangouste quelque chose comme ci-dessous
var PostSchema = new Schema({
title: String,
description: String,
loc: {
type: [Number], // [<longitude>, <latitude>]
index: '2d' // create the geospatial index
}
//some other fields
}
module.exports = mongoose.model('Post', PostSchema);
également pour la zone de recherche, il y a d'autres options disponibles comme la boîte
var lowerLeft = [40.73083, -73.99756]
var upperRight= [40.741404, -73.988135]
query.where('loc').within().box(lowerLeft, upperRight)
Pour les deux Géolocalisation recherche et la recherche de texte pour travailler, assurez-vous d'avoir index sur le champ loc et le champ de texte. Plus de détails ici. loc Search et text search
puis-je utiliser $ opérateurs lt et gt $ si la latitude et la longitude sont stockées dans un tableau ; quelque chose comme- loc: [50.433234,20,220123] –