This is a short guide about how to configure your mongoDB in order to calculate the closest distance between two coordinates.
In this case I will use a 2d index because it works with two-dimensional plane, latitude and latitude, which are the properties I have in my model. If you need more information about this index go to mongoDB documentation.
First, you will need a Coordinate object that will contain the latitude and longitude:
public class Coordinate { public double Longitude { get; set; } public double Latitude { get; set; } }
after you created that object, you will need to add it inside your model:
[BsonIgnoreExtraElements] public class MyLocation { public ObjectId _id { get; set; } public Coordinate Coordinates { get; set; } }
This is how it should look like when you add a new document in your collection:
Before I explain how to perform a query to mongoDB, I would like to show you how to create programmatically a Geospatial Index that will let us calculate the closest distance.
private static void CreateGeoSpatialIndex() { string connectionString = ConfigurationManager.ConnectionStrings[Settings.GetSetting("MyDatabase")]; if (connectionString == null || string.IsNullOrWhiteSpace(connectionString.ConnectionString)) return; var mongoUrl = new MongoUrl(connectionString.ConnectionString); var server = (new MongoClient(connectionString.ConnectionString)).GetServer(); var database = server.GetDatabase(mongoUrl.DatabaseName); if (database == null) return; var collection = database.GetCollection(Settings.GetSetting("MyCollection")); if (collection == null) return; collection.EnsureIndex(IndexKeys.GeoSpatial("Coordinates")); }
Notice “MyDatabase” is the name of connection string defined in the App_Config/ConnectionStrings.config
<add name="MyDatabase" connectionString="mongodb://localhost/appdata" />
If you want to create the index directly in mongoDB you can read this tutorial.
Once you’ve created the index, you can query if it is present in your collection:
db.getCollection('MyCollection').getIndexes()
Now, we are ready to query the closest distance between two coordinates. Take a look at the code below and you will notice that I use the Near operator. I will use MongoDB.Driver library to perform queries.
public IEnumerable<MyLocation> GetClosestLocations(double latitude, double longitude) { var db = GetMyCollection(); var divisionQueryList = new List<IMongoQuery>(); var nearLocations = db.FindAs<MyLocation>(Query.And(Query<MyLocation>.Near(q => q.Coordinates, longitude, latitude))); return nearLocations; } private static MongoDbCollection GetLocationsCollection() { var mongoDbDriver = MongoDbDriver.FromConnectionString(Settings.GetSetting("MyDatabase")); return mongoDbDriver[Settings.GetSetting("MyCollection")]; }
You can use .Take(int) to return a specified number of items.
That’s it for today. Hope this is helpful for you.
Happy Sitecoring 😉