MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Crea e trova GeoLocation in mangusta

Se vuoi che uno schema supporti GeoJSON, devi prima costruirlo correttamente:

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

Ciò assicura che non vi sia confusione con la parola chiave "tipo" della definizione dello schema. Se vuoi davvero supportare l'intera gamma di tipi GeoJSON, puoi renderlo un po' più ampio:

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

Quindi vuoi legare un indice allo shema:

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

Quindi, ovviamente, definisci un modello e archivia le cose correttamente:

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

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

Notando che i tuoi dati devono essere in longitudine quindi latitudine ordine come supportato da GeoJSON e tutti i moduli di query geospaziali MongoDB.

Quindi, invece di scavare negli usi oscuri dei comandi del database direttamente sul metodo del driver non elaborato, usa invece cose che sono direttamente supportate e migliori. Ad esempio $geoNear per il .aggregate() metodo:

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

    }
)

E ora, poiché i dati sono GeoJSON, le distanze sono già state convertite in metri, quindi non è necessario eseguire altri lavori di conversione.

Tieni inoltre presente che hai scherzato con questo, a meno che non elimini la raccolta, qualsiasi indice che hai provato sarà ancora lì e ciò probabilmente causerà problemi.

Puoi eliminare facilmente tutti gli indici dalla raccolta nella shell mongodb:

db.users.dropIndexes();

Oppure, poiché è probabile che tu debba rimodellare i dati, elimina la raccolta e ricomincia:

db.users.drop();

Imposta le cose correttamente e non avrai problemi.