MongoDB geospatial index in C #

I tried to get started, but after that I started in the same rock, trying to create and query MongoDB with the official C # driver. The problem is how to create data with geoinformation. I just can’t find the answer.

code:

MongoUrl url = new MongoUrl("mongodb://xxx.xx.x.xx/mydb"); MongoServer server = MongoServer.Create(url); MongoDatabase database = server.GetDatabase("mydb"); 

<- this works great

 BsonDocument[] batch = { new BsonDocument { { "name", "Bran" }, { "loc", "10, 10" } }, new BsonDocument { { "name", "Ayla" }, { "loc", "0, 0" } } }; places.InsertBatch(batch); 

<- this part is not so somehow

 places.EnsureIndex(IndexKeys.GeoSpatial("loca")); var queryplaces = Query.WithinCircle("loca", 0, 0, 11); var cursor = places.Find(queryplaces); foreach (var hit in cursor) { foreach (var VARIABLE in hit) { Console.WriteLine(VARIABLE.Value); } } 

- I think that in this part both documents should be displayed, which are not yet displayed. A simple find shows them both. I would be happy for your help.

+4
source share
2 answers

After searching and searching, I found the answer here: https://github.com/karlseguin/pots-importer/blob/master/PotsImporter/NodeImporter.cs

This will be read with my first part of the code as this fixes it.

  MongoCollection<BsonDocument> places = database.GetCollection<BsonDocument>("places"); BsonDocument[] batch = { new BsonDocument { { "name", "Bran" }, { "loc", new BsonArray(new[] { 10, 10 }) } }, new BsonDocument { { "name", "Ayla" }, { "loc", new BsonArray(new[] { 0, 0 }) } } }; places.InsertBatch(batch); places.EnsureIndex(IndexKeys.GeoSpatial("loc")); var queryplaces = Query.WithinCircle("loc", 5, 5, 10); var cursor = places.Find(queryplaces); foreach (var hit in cursor) { Console.WriteLine("in circle"); foreach (var VARIABLE in hit) { Console.WriteLine(VARIABLE.Value); } } 

As a point of clarification: the problem with the code in the question is that the location information should not be stored as a string, but rather as an array of two elements (x, y).

+2
source
Example

given below in C # (it is important to note the order in the array, which is longitude, latitude - a more logical order of x, y follows, in contrast to the more commonly used form, where latitude precedes longitude):

1.) first, your class should have this:

 public double[] Location { get; set; } public double Latitude { get { return _latitude; } set { Location[1] = value; _latitude = value; } } public double Longitude { get { return _longitude; } set { Location[0] = value; _longitude = value; } } public MyClass() { Location = new double[2]; } 

2.), then here is some code to get you started with the official C # driver and insert using geo-indexing:

  /// <summary> /// Inserts object and creates GeoIndex on collection (assumes TDocument is a class /// containing an array double[] Location where [0] is the x value (as longitude) /// and [1] is the y value (as latitude) - this order is important for spherical queries. /// /// Collection name is assigned as typeof(TDocument).ToString() /// </summary> /// <param name="dbName">Your target database</param> /// <param name="data">The object you're storing</param> /// <param name="geoIndexName">The name of the location based array on which to create the geoIndex</param> /// <param name="indexNames">optional: a dictionary containing any additional fields on which you would like to create an index /// where the key is the name of the field on which you would like to create your index and the value should be either SortDirection.Ascending /// or SortDirection.Descending. NOTE: this should not include geo indexes! </param> /// <returns>void</returns> public static void MongoGeoInsert<TDocument>(string dbName, TDocument data, string geoIndexName, Dictionary<string, SortDirection> indexNames = null) { Connection connection = new Connection(dbName); MongoCollection collection = connection.GetMongoCollection<TDocument>(typeof(TDocument).Name, connection.Db); collection.Insert<TDocument>(data); /* NOTE: Latitude and Longitude MUST be wrapped in separate class or array */ IndexKeysBuilder keys = IndexKeys.GeoSpatial(geoIndexName); IndexOptionsBuilder options = new IndexOptionsBuilder(); options.SetName("idx_" + typeof(TDocument).Name); // since the default GeoSpatial range is -180 to 180, we don't need to set anything here, but if // we wanted to use something other than latitude/longitude, we could do so like this: // options.SetGeoSpatialRange(-180.0, 180.0); if (indexNames != null) { foreach (var indexName in indexNames) { if (indexName.Value == SortDirection.Decending) { keys = keys.Descending(indexName.Key); } else if (indexName.Value == SortDirection.Ascending) { keys = keys.Ascending(indexName.Key); } } } collection.EnsureIndex(keys, options); connection.Db.Server.Disconnect(); } using System; using System.Collections.Generic; using System.Linq; using System.Text; using MongoDB.Bson; using MongoDB.Driver; namespace MyMongo.Helpers { public class Connection { private const string DbName = ""; private const string Prefix = "mongodb://"; //private const string Server = "(...):27017/"; private const string Server = "localhost:27017/"; private const string PassWord = ""; private const string UserName = ""; private const string Delimeter = ""; //if using MongoHQ //private const string Delimeter = ":"; //private const string Prefix = "mongodb://"; //private const string DbName = "(...)"; //private const string UserName = "(...)"; //private const string Server = "@flame.mongohq.com:(<port #>)/"; //private const string PassWord = "(...)"; private readonly string _connectionString = string.Empty; public MongoDatabase Db { get; private set; } public MongoCollection Collection { get; private set; } public Connection() { _connectionString = Prefix + UserName + Delimeter + PassWord + Server + DbName; } public Connection(string dbName) { _connectionString = Prefix + UserName + Delimeter + PassWord + Server + DbName; Db = GetDatabase(dbName); } //mongodb://[username: password@ ]hostname[:port][/[database][?options]] public MongoDatabase GetDatabase(string dbName) { MongoServer server = MongoServer.Create(_connectionString); MongoDatabase database = server.GetDatabase(dbName); return database; } public MongoCollection<TDocument> GetMongoCollection<TDocument>(string collectionName, MongoDatabase db, SafeMode safeMode = null) { if (safeMode == null) { safeMode = new SafeMode(true); } MongoCollection<TDocument> result = db.GetCollection<TDocument>(collectionName, safeMode); return result; } } } 
+6
source

All Articles