sql >> Base de Datos >  >> NoSQL >> MongoDB

Crear y encontrar geolocalización en mongoose

Si desea que un esquema sea compatible con GeoJSON, primero debe construirlo correctamente:

var userSchema = new Schema({
    loc: {
        type: { type: String },
        coordinates: [Number],
    }
});

Eso asegura que no haya confusión con la palabra clave "tipo" de la definición del esquema. Si realmente desea admitir toda la gama de tipos de GeoJSON, puede hacerlo un poco más flexible:

var userSchema = new Schema({
    loc: {
        type: { type: String },
        coordinates: []
    }
});

A continuación, desea vincular un índice al shema:

userSchema.index({ "loc": "2dsphere" });

Luego, por supuesto, define un modelo y almacena las cosas correctamente:

var User = mongoose.model( "User", userSchema );

 var user = new User({ 
     "loc": { 
         "type": "Point",
         "coordinates": [-73.97, 40.77]
     }
 });

Tenga en cuenta que sus datos deben estar en longitud luego latitud orden según lo admite GeoJSON y todos los formularios de consulta geoespacial de MongoDB.

A continuación, en lugar de profundizar en los usos oscuros de los comandos de la base de datos directamente en el método del controlador sin procesar, use cosas que sean directamente compatibles y mejores. Como $geoNear para el .aggregate() método:

User.aggregate(
    [
        { "$geoNear": {
            "near": {
                "type": "Point",
                "coordinates": [<long>,<lat>]
            },
            "distanceField": "distance",
            "spherical": true,
            "maxDistance": 10000
        }}
    ],
    function(err,results) {

    }
)

Y ahora, debido a que los datos son GeoJSON, las distancias ya están convertidas a metros, por lo que no es necesario realizar ningún otro trabajo de conversión.

También tenga en cuenta que ha estado jugando con esto, a menos que elimine la colección, cualquier índice que haya probado seguirá allí y eso probablemente causará problemas.

Puede colocar todos los índices de la colección en el shell mongodb con facilidad:

db.users.dropIndexes();

O, dado que es probable que necesite remodelar algunos datos, suelte la colección y comience de nuevo:

db.users.drop();

Configure las cosas correctamente y no tendrá problemas.