Wenn Sie möchten, dass ein Schema GeoJSON unterstützt, müssen Sie das zuerst richtig konstruieren:
var userSchema = new Schema({
loc: {
type: { type: String },
coordinates: [Number],
}
});
Dadurch wird sichergestellt, dass es keine Verwechslung mit dem Schlüsselwort "type" der Schemadefinition gibt. Wenn Sie wirklich die gesamte Palette von GeoJSON-Typen unterstützen möchten, können Sie das etwas lockerer machen:
var userSchema = new Schema({
loc: {
type: { type: String },
coordinates: []
}
});
Als nächstes wollen Sie einen Index an das Schema binden:
userSchema.index({ "loc": "2dsphere" });
Dann natürlich ein Modell definieren und richtig abspeichern:
var User = mongoose.model( "User", userSchema );
var user = new User({
"loc": {
"type": "Point",
"coordinates": [-73.97, 40.77]
}
});
Beachten Sie, dass Ihre Daten in Längengrad angegeben werden müssen dann Breitengrad order wie von GeoJSON und allen Geodaten-Abfrageformularen von MongoDB unterstützt.
Als nächstes, anstatt sich mit obskuren Verwendungen von Datenbankbefehlen direkt auf der Raw-Treibermethode zu beschäftigen, verwenden Sie stattdessen Dinge, die direkt unterstützt werden, und besser. Zum Beispiel $geoNear
für .aggregate()
Methode:
User.aggregate(
[
{ "$geoNear": {
"near": {
"type": "Point",
"coordinates": [<long>,<lat>]
},
"distanceField": "distance",
"spherical": true,
"maxDistance": 10000
}}
],
function(err,results) {
}
)
Und da es sich bei den Daten um GeoJSON handelt, sind die Entfernungen bereits in Meter konvertiert, sodass keine weiteren Konvertierungsarbeiten erforderlich sind.
Beachten Sie auch, dass Sie damit herumgespielt haben, es sei denn, Sie löschen die Sammlung, jeder Index, den Sie versucht haben, wird immer noch da sein und das wird wahrscheinlich Probleme verursachen.
Sie können ganz einfach alle Indizes aus der Sammlung in der Mongodb-Shell löschen:
db.users.dropIndexes();
Oder da Sie wahrscheinlich einige Daten umformen müssen, löschen Sie die Sammlung und beginnen Sie erneut:
db.users.drop();
Richten Sie die Dinge richtig ein und Sie werden keine Probleme haben.