Hvis du vil have et skema til at understøtte GeoJSON, skal du først konstruere det korrekt:
var userSchema = new Schema({
loc: {
type: { type: String },
coordinates: [Number],
}
});
Det sikrer, at der ikke er nogen forveksling med "type" nøgleordet i skemadefinitionen. Hvis du virkelig vil understøtte hele udvalget af GeoJSON-typer, så kan du gøre det lidt løsere:
var userSchema = new Schema({
loc: {
type: { type: String },
coordinates: []
}
});
Dernæst vil du binde et indeks til shemaet:
userSchema.index({ "loc": "2dsphere" });
Så skal du selvfølgelig definere en model og opbevare tingene korrekt:
var User = mongoose.model( "User", userSchema );
var user = new User({
"loc": {
"type": "Point",
"coordinates": [-73.97, 40.77]
}
});
Bemærk, at dine data skal være i længdegrad derefter breddegrad rækkefølge som understøttet af GeoJSON og alle MongoDB geospatiale forespørgselsformularer.
Dernæst, i stedet for at grave i obskur brug af databasekommandoer direkte på rådrivermetoden, skal du bruge ting i stedet, der er direkte understøttet, og bedre. Såsom $geoNear
for .aggregate()
metode:
User.aggregate(
[
{ "$geoNear": {
"near": {
"type": "Point",
"coordinates": [<long>,<lat>]
},
"distanceField": "distance",
"spherical": true,
"maxDistance": 10000
}}
],
function(err,results) {
}
)
Og nu, fordi dataene er GeoJSON, er afstandene allerede konverteret til meter, så der er ingen grund til at udføre andet konverteringsarbejde.
Bemærk også, at du har rodet rundt med dette, medmindre du dropper samlingen, vil ethvert indeks, du prøvede, stadig være der, og det vil sandsynligvis forårsage problemer.
Du kan nemt slippe alle indekser fra samlingen i mongodb-skallen:
db.users.dropIndexes();
Eller da du sandsynligvis skal lave noget omformning af data, så slip indsamlingen og start igen:
db.users.drop();
Indstil tingene korrekt, og du vil ikke have nogen problemer.