Ако искате схема да поддържа GeoJSON, първо трябва да я конструирате правилно:
var userSchema = new Schema({
loc: {
type: { type: String },
coordinates: [Number],
}
});
Това гарантира, че няма объркване с ключовата дума "type" на дефиницията на схемата. Ако наистина искате да поддържате цялата гама от типове GeoJSON, тогава можете да направите това малко по-свободно:
var userSchema = new Schema({
loc: {
type: { type: String },
coordinates: []
}
});
След това искате да свържете индекс към схемата:
userSchema.index({ "loc": "2dsphere" });
След това, разбира се, дефинирайте модел и съхранявайте нещата правилно:
var User = mongoose.model( "User", userSchema );
var user = new User({
"loc": {
"type": "Point",
"coordinates": [-73.97, 40.77]
}
});
Отбелязвайки, че вашите данни трябва да са в географска дължина след това географска ширина ред, както се поддържа от GeoJSON и всички формуляри за геопространствени заявки на MongoDB.
След това, вместо да се задълбочавате в неясни употреби на команди на базата данни директно върху метода на необработения драйвер, вместо това използвайте неща, които се поддържат директно и по-добре. Като например $geoNear
за .aggregate()
метод:
User.aggregate(
[
{ "$geoNear": {
"near": {
"type": "Point",
"coordinates": [<long>,<lat>]
},
"distanceField": "distance",
"spherical": true,
"maxDistance": 10000
}}
],
function(err,results) {
}
)
И сега, тъй като данните са GeoJSON, разстоянията вече са преобразувани в метри, така че няма нужда да се извършва друга работа по преобразуване.
Също така имайте предвид, че сте се забърквали с това, освен ако не пуснете колекцията, всеки индекс, който сте опитали, ще остане там и това вероятно ще причини проблеми.
Можете лесно да премахнете всички индекси от колекцията в обвивката на mongodb:
db.users.dropIndexes();
Или тъй като вероятно трябва да направите малко преоформяне на данни, след това изпуснете колекцията и започнете отново:
db.users.drop();
Настрой нещата както трябва и няма да имаш проблеми.