Pokud chcete, aby schéma podporovalo GeoJSON, musíte jej nejprve správně zkonstruovat:
var userSchema = new Schema({
loc: {
type: { type: String },
coordinates: [Number],
}
});
To zajišťuje, že nedojde k záměně s klíčovým slovem "type" definice schématu. Pokud opravdu chcete podporovat celou řadu typů GeoJSON, můžete to udělat trochu volnější:
var userSchema = new Schema({
loc: {
type: { type: String },
coordinates: []
}
});
Dále chcete k shema přiřadit index:
userSchema.index({ "loc": "2dsphere" });
Pak samozřejmě definujte model a uložte věci správně:
var User = mongoose.model( "User", userSchema );
var user = new User({
"loc": {
"type": "Point",
"coordinates": [-73.97, 40.77]
}
});
Vaše data musí být v zeměpisné délce pak zeměpisná šířka objednat tak, jak to podporuje GeoJSON a všechny formuláře geoprostorových dotazů MongoDB.
Dále, místo abyste se hrabali v obskurních způsobech použití databázových příkazů přímo na metodě nezpracovaných ovladačů, použijte místo toho věci, které jsou přímo podporované a lepší. Například $geoNear
pro .aggregate()
metoda:
User.aggregate(
[
{ "$geoNear": {
"near": {
"type": "Point",
"coordinates": [<long>,<lat>]
},
"distanceField": "distance",
"spherical": true,
"maxDistance": 10000
}}
],
function(err,results) {
}
)
A nyní, protože data jsou GeoJSON, vzdálenosti jsou již převedeny na metry, takže není třeba provádět další převodní práci.
Všimněte si také, že jste si s tím pohrávali, dokud kolekci nezrušíte, jakýkoli index, který jste zkusili, tam stále bude a to pravděpodobně způsobí problémy.
Všechny indexy z kolekce můžete snadno zrušit v prostředí mongodb:
db.users.dropIndexes();
Nebo protože pravděpodobně budete muset provést nějakou změnu tvaru dat, pak sbírku zahoďte a začněte znovu:
db.users.drop();
Nastavte věci správně a nebudete mít žádné problémy.