Als je wilt dat een schema GeoJSON ondersteunt, moet je dat eerst goed construeren:
var userSchema = new Schema({
loc: {
type: { type: String },
coordinates: [Number],
}
});
Dat zorgt ervoor dat er geen verwarring is met het sleutelwoord "type" van de schemadefinitie. Als je echt het hele scala aan GeoJSON-typen wilt ondersteunen, kun je dat wat losser maken:
var userSchema = new Schema({
loc: {
type: { type: String },
coordinates: []
}
});
Vervolgens wil je een index aan de shema koppelen:
userSchema.index({ "loc": "2dsphere" });
Definieer dan natuurlijk een model en sla de zaken correct op:
var User = mongoose.model( "User", userSchema );
var user = new User({
"loc": {
"type": "Point",
"coordinates": [-73.97, 40.77]
}
});
Houd er rekening mee dat uw gegevens zich op lengtegraad moeten bevinden dan breedtegraad bestellen zoals ondersteund door GeoJSON en alle MongoDB geospatiale queryformulieren.
Vervolgens, in plaats van te graven in obscuur gebruik van databasecommando's direct op de onbewerkte drivermethode, gebruik in plaats daarvan dingen die direct worden ondersteund, en beter. Zoals $geoNear
voor de .aggregate()
methode:
User.aggregate(
[
{ "$geoNear": {
"near": {
"type": "Point",
"coordinates": [<long>,<lat>]
},
"distanceField": "distance",
"spherical": true,
"maxDistance": 10000
}}
],
function(err,results) {
}
)
En omdat de gegevens GeoJSON zijn, zijn de afstanden al geconverteerd naar meters, dus er is geen noodzaak om ander conversiewerk te doen.
Merk ook op dat je hiermee aan het rommelen bent, tenzij je de verzameling laat vallen, zal elke index die je hebt geprobeerd er nog steeds zijn en dat zal waarschijnlijk problemen veroorzaken.
Je kunt met gemak alle indexen uit de collectie in de mongodb-shell neerzetten:
db.users.dropIndexes();
Of aangezien u waarschijnlijk wat gegevens opnieuw moet vormgeven, laat dan de verzameling vallen en begin opnieuw:
db.users.drop();
Stel de zaken goed in en u zult geen problemen ondervinden.