sql >> Databasteknik >  >> NoSQL >> MongoDB

Skapa och hitta GeoLocation i mongoose

Om du vill att ett schema ska stödja GeoJSON måste du först konstruera det ordentligt:

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

Det säkerställer att det inte finns någon förväxling med nyckelordet "typ" i schemadefinitionen. Om du verkligen vill stödja hela utbudet av GeoJSON-typer kan du göra det lite lösare:

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

Därefter vill du knyta ett index till sheman:

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

Sedan definierar du självklart en modell och lagrar saker korrekt:

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

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

Observera att din data måste vara i longitud sedan latitud ordning som stöds av GeoJSON och alla MongoDB geospatiala frågeformulär.

Därefter, istället för att gräva i obskyra användningar av databaskommandon direkt på den råa drivrutinsmetoden, använd istället saker som stöds direkt, och bättre. Såsom $geoNear för .aggregate() metod:

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

    }
)

Och nu eftersom data är GeoJSON, är avstånden redan omvandlade till meter så det finns inget behov av att göra annat konverteringsarbete.

Observera också att du har bråkat med detta, såvida du inte släpper samlingen kommer alla index du försökte fortfarande finnas där och det kommer sannolikt att orsaka problem.

Du kan enkelt släppa alla index från samlingen i mongodb-skalet:

db.users.dropIndexes();

Eller eftersom du sannolikt behöver göra en omformning av data, släpp insamlingen och börja om:

db.users.drop();

Ställ in saker och ting ordentligt och du kommer inte ha några problem.



  1. Mongoose Compound Index Unik + Sparse

  2. HÄMTA inte req.query.name till collection.find i express och MongoDB

  3. Uppdatera Mongo-array:ta bort dynamisk nyckel

  4. Varför MongoDb-sortering är långsam med uppslagssamlingar