Se você deseja que um esquema suporte GeoJSON, primeiro você precisa construir isso corretamente:
var userSchema = new Schema({
loc: {
type: { type: String },
coordinates: [Number],
}
});
Isso garante que não haja confusão com a palavra-chave "type" da definição do esquema. Se você realmente deseja oferecer suporte a toda a gama de tipos GeoJSON, pode torná-lo um pouco mais flexível:
var userSchema = new Schema({
loc: {
type: { type: String },
coordinates: []
}
});
Em seguida, você deseja vincular um índice ao shema:
userSchema.index({ "loc": "2dsphere" });
Então, claro, defina um modelo e armazene as coisas corretamente:
var User = mongoose.model( "User", userSchema );
var user = new User({
"loc": {
"type": "Point",
"coordinates": [-73.97, 40.77]
}
});
Observando que seus dados devem estar em longitude então latitude ordem conforme suportado pelo GeoJSON e todos os formulários de consulta geoespacial do MongoDB.
Em seguida, em vez de se aprofundar em usos obscuros de comandos de banco de dados diretamente no método de driver bruto, use coisas que são diretamente suportadas e melhor. Como
$geoNear
para o .aggregate()
método:User.aggregate(
[
{ "$geoNear": {
"near": {
"type": "Point",
"coordinates": [<long>,<lat>]
},
"distanceField": "distance",
"spherical": true,
"maxDistance": 10000
}}
],
function(err,results) {
}
)
E agora porque os dados são GeoJSON, as distâncias já estão convertidas em metros, então não há necessidade de fazer outro trabalho de conversão.
Observe também que você está brincando com isso, a menos que você descarte a coleção, qualquer índice que você tentou ainda estará lá e isso provavelmente causará problemas.
Você pode descartar todos os índices da coleção no shell mongodb com facilidade:
db.users.dropIndexes();
Ou, como você provavelmente precisará reformular os dados, descarte a coleção e comece novamente:
db.users.drop();
Configure as coisas corretamente e você não terá problemas.