Jeśli chcesz, aby schemat obsługiwał GeoJSON, najpierw musisz go odpowiednio skonstruować:
var userSchema = new Schema({
loc: {
type: { type: String },
coordinates: [Number],
}
});
Dzięki temu nie ma pomyłek ze słowem kluczowym „type” definicji schematu. Jeśli naprawdę chcesz obsługiwać całą gamę typów GeoJSON, możesz to nieco rozluźnić:
var userSchema = new Schema({
loc: {
type: { type: String },
coordinates: []
}
});
Następnie chcesz powiązać indeks z shema:
userSchema.index({ "loc": "2dsphere" });
Następnie oczywiście zdefiniuj model i poprawnie przechowuj rzeczy:
var User = mongoose.model( "User", userSchema );
var user = new User({
"loc": {
"type": "Point",
"coordinates": [-73.97, 40.77]
}
});
Pamiętaj, że Twoje dane muszą mieć długość geograficzną następnie szerokość geograficzna kolejność obsługiwana przez GeoJSON i wszystkie geoprzestrzenne formularze zapytań MongoDB.
Następnie, zamiast zagłębiać się w niejasne zastosowania poleceń bazy danych bezpośrednio w metodzie surowego sterownika, użyj zamiast tego rzeczy, które są bezpośrednio obsługiwane i lepsze. Na przykład $geoNear
dla .aggregate()
metoda:
User.aggregate(
[
{ "$geoNear": {
"near": {
"type": "Point",
"coordinates": [<long>,<lat>]
},
"distanceField": "distance",
"spherical": true,
"maxDistance": 10000
}}
],
function(err,results) {
}
)
A teraz, ponieważ dane są w formacie GeoJSON, odległości są już przeliczane na metry, więc nie ma potrzeby wykonywania innych prac związanych z konwersją.
Zwróć też uwagę, że bawiłeś się z tym, chyba że usuniesz kolekcję, każdy indeks, który wypróbowałeś, nadal tam będzie, co prawdopodobnie spowoduje problemy.
Możesz z łatwością usunąć wszystkie indeksy z kolekcji w powłoce mongodb:
db.users.dropIndexes();
Lub ponieważ prawdopodobnie będziesz musiał zmienić kształt danych, usuń kolekcję i zacznij od nowa:
db.users.drop();
Ustaw wszystko prawidłowo, a nie będziesz mieć problemów.