Jika Anda ingin skema mendukung GeoJSON, pertama-tama Anda harus membuatnya dengan benar:
var userSchema = new Schema({
loc: {
type: { type: String },
coordinates: [Number],
}
});
Itu memastikan tidak ada kebingungan dengan kata kunci "type" dari definisi skema. Jika Anda benar-benar ingin mendukung semua jenis GeoJSON, Anda dapat membuatnya sedikit lebih longgar:
var userSchema = new Schema({
loc: {
type: { type: String },
coordinates: []
}
});
Selanjutnya Anda ingin mengikat indeks ke shema:
userSchema.index({ "loc": "2dsphere" });
Kemudian tentu saja tentukan model dan simpan semuanya dengan benar:
var User = mongoose.model( "User", userSchema );
var user = new User({
"loc": {
"type": "Point",
"coordinates": [-73.97, 40.77]
}
});
Perhatikan bahwa data Anda harus dalam bujur lalu lintang memesan seperti yang didukung oleh GeoJSON dan semua formulir kueri geospasial MongoDB.
Selanjutnya, daripada menggali penggunaan perintah database yang tidak jelas secara langsung pada metode driver mentah, gunakan hal-hal yang didukung secara langsung, dan lebih baik. Seperti $geoNear
untuk .aggregate()
metode:
User.aggregate(
[
{ "$geoNear": {
"near": {
"type": "Point",
"coordinates": [<long>,<lat>]
},
"distanceField": "distance",
"spherical": true,
"maxDistance": 10000
}}
],
function(err,results) {
}
)
Dan sekarang karena datanya adalah GeoJSON, jarak sudah dikonversi ke meter sehingga tidak perlu melakukan pekerjaan konversi lainnya.
Perhatikan juga bahwa Anda telah bermain-main dengan ini, kecuali jika Anda menjatuhkan koleksi, indeks apa pun yang Anda coba akan tetap ada dan itu kemungkinan akan menyebabkan masalah.
Anda dapat menghapus semua indeks dari koleksi di shell mongodb dengan mudah:
db.users.dropIndexes();
Atau karena Anda mungkin perlu melakukan pembentukan ulang data, lalu hapus koleksi dan mulai lagi:
db.users.drop();
Atur semuanya dengan benar dan Anda tidak akan mengalami masalah.