Я использую драйвер MongoDB C # и пытаюсь получить Query.Near, чтобы работать, чтобы вернуть дома для продажи в пределах 5, 10, 25 или 50 миль от центральной точки. Вот запрос:
var near = Query.Near("Coordinates", coordinates.Latitude, coordinates.Longitude, find.GetRadiansAway(), false);
//var near = Query.WithinCircle("Coordinates", coordinates.Latitude, coordinates.Longitude, find.GetRadiansAway(), false);
var query = Collection().Find(near);
query.Limit = 1000;
var listings = query.ToList();
Я делю радиус мили на 62.1868289, чтобы получить радианы, и ввожу их в запрос, однако он возвращает одинаковое количество домов на продажу независимо от того, какое значение в радианах я передаю. Я также пытался установить оба сферических параметра. true и с использованием Query.WithinCircle, однако ни один из них не работает лучше.
Я использую последний драйвер C # (1.0.0.4098), это ошибка в драйвере C #, ошибка в MongoDB, или я что-то здесь упускаю?
Вот как выглядят запросы:
5 миль (рядом):
db.Listing.find({ "Coordinates" : { "$near" : [39.4812172, -76.6438598], "$maxDistance" : 0.072463768115942032 } });
10 миль (рядом):
db.Listing.find({ "Coordinates" : { "$near" : [39.4812172, -76.6438598], "$maxDistance" : 0.14492753623188406 } });
5 миль (сферически близко):
db.Listing.find({ "Coordinates" : { "$nearSphere" : [39.4812172, -76.6438598], "$maxDistance" : 0.0012629451881788331 } });
10 миль (сферически близко):
db.Listing.find({ "Coordinates" : { "$nearSphere" : [39.4812172, -76.6438598], "$maxDistance" : 0.0025258903763576662 } });
Вот мой тестовый пример, который возвращает то же самое количество результатов, независимо от того, пройду я через 5 миль или 25 миль:
[Test]
public void NearTest()
{
var isSpherical = true;
var latitude = 39.4812172;
var longitude = -76.6438598;
var milesAway = 5;
var distance = milesAway / (isSpherical ? 3959.0 : 69.0);
//search within 5 miles.
var near = Query.Near("Coordinates", latitude, longitude, distance, isSpherical);
var collection = ContextWorker.Database.GetCollection<Schemas.Listing.Listing>("Listing");
var query = collection.Find(near);
query.Limit = 1000;
var listings = query.ToList();
var count1 = listings.Count;
//Console.WriteLine("query: {0}", query.ToJson());
Console.WriteLine(count1 + " results returned that are " + milesAway + " miles away");
//search within 25 miles.
milesAway = 25;
distance = milesAway / (isSpherical ? 3959.0 : 69.0);
near = Query.Near("Coordinates", latitude, longitude, distance, isSpherical);
query = collection.Find(near);
query.Limit = 1000;
listings = query.ToList();
var count2 = listings.Count;
//Console.WriteLine("query: {0}", query.ToJson());
Console.WriteLine(count2 + " results returned that are " + milesAway + " miles away");
//values should be different.
Assert.AreNotEqual(count1, count2, "Returned same results for 5 and 25 miles away");
}
172 results returned that are 5 miles away
172 results returned that are 25 miles away
Test 'Housters.Test.SearchTest.NearTest' failed:
Returned same results for 5 and 25 miles away
Expected: not 172
But was: 172
SearchTest.cs(68,0): at Housters.Test.SearchTest.NearTest()