Параметр maxDistance в Query.Near не работает - PullRequest
2 голосов
/ 17 мая 2011

Я использую драйвер 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()

Ответы [ 2 ]

5 голосов
/ 17 мая 2011

Здесь куча проблем:

  1. Практически во всех геопространственных запросах Монго сначала указывается координата х (долгота).
  2. Когда вы не используете сферические запросы, Mongo просто вычисляет простые декартовы расстояния, и расстояние, которое вам нужно пройти, равно единицам ваших координат (вероятно, десятичных градусов).
  3. Если вы делаете , используя сферический запрос (либо рядом, либо внутри), вам нужно указать расстояние в радианах, но для преобразования из миль в радианы вам нужно разделить на гораздо большее число чем 62.1868289. Вы переводите из радианов в мили путем деления на радиус Земли (около 3959 миль).

Преобразование, которое вы выполнили выше, на самом деле намного ближе к преобразованию из миль в градусы (разделите расстояние в милях примерно на 69).

1 голос
/ 17 мая 2011

Хороший способ определить, есть ли проблема в драйвере C # или в самих запросах, - это сначала заставить запросы работать в оболочке mongo. Затем вы можете написать эквивалентный запрос с помощью построителя запросов C #. В качестве окончательной проверки вы можете увидеть, что эквивалентный запрос JSON будет выглядеть следующим образом:

var query = Query.Near (...); var json = query.ToJson ();

Можете ли вы предоставить образцы документов, которые, по вашему мнению, должны быть возвращены?

...