MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Créer et trouver une géolocalisation dans la mangouste

Si vous souhaitez qu'un schéma prenne en charge GeoJSON, vous devez d'abord le construire correctement :

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

Cela garantit qu'il n'y a pas de confusion avec le mot-clé "type" de la définition du schéma. Si vous voulez vraiment prendre en charge toute la gamme de types GeoJSON, vous pouvez rendre cela un peu plus souple :

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

Ensuite, vous voulez lier un index au shema :

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

Ensuite, bien sûr, définissez un modèle et stockez les choses correctement :

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

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

Notez que vos données doivent être en longitude puis latitude commande prise en charge par GeoJSON et tous les formulaires de requête géospatiale MongoDB.

Ensuite, plutôt que de creuser dans les utilisations obscures des commandes de base de données directement sur la méthode du pilote brut, utilisez plutôt des choses qui sont directement prises en charge, et mieux. Tels que $geoNear pour le .aggregate() méthode :

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

    }
)

Et maintenant, comme les données sont GeoJSON, les distances sont déjà converties en mètres, il n'est donc pas nécessaire d'effectuer d'autres travaux de conversion.

Notez également que vous avez déconné avec cela, à moins que vous ne supprimiez la collection, tout index que vous avez essayé sera toujours là et cela causera probablement des problèmes.

Vous pouvez facilement déposer tous les index de la collection dans le shell mongodb :

db.users.dropIndexes();

Ou puisque vous avez probablement besoin de remodeler les données, supprimez la collection et recommencez :

db.users.drop();

Configurez les choses correctement et vous n'aurez aucun problème.