2016-07-13 3 views
0

У меня возникает эта странная проблема при использовании mongo для запроса местоположений вблизи географической точки. Я замечаю, что всякий раз, когда я пытаюсь фильтровать $ nearSphere через драйвер C#, фильтр просто возвращает все совпадения независимо от того, находятся ли они в заданном диапазоне или нет. Что более странно в том, что тот же самый запрос работает в оболочке mongo и возвращает только правильные совпадения.GeoSpatial запросы работают в оболочке mongo, но не фильтруются в C#-драйвере

E.g.

У меня есть несколько объектов комнаты в базе данных, которые имеют поле RoomLocation, которое определено в базе данных как тип: Point (Создано в C# -кодере как объект GeoJsonPoint, который затем сериализуется). Эти точки имеют координаты [0, 0] и [3, 3], и я запрашиваю от [0, 0] с максимальным расстоянием 3, поэтому вторая точка не должна быть найдена (это географические местоположения, поэтому расстояние должно быть хорошим несколько сотен километров, конечно, не 3.)

запрос Я бегу это:

db.Rooms.find({ 
    "RoomLocation": 
     { $nearSphere: 
     { $geometry: { type: "Point", coordinates: [0, 0]}, 
      $maxDistance: 3 
     } 
     } 
    } 
) 

Который работает нормально и только возвращает [0, 0] указывают. Однако, если я запускаю следующий код в моем проекте C#:

 FilterDefinition<GameRoom> filter = Builders<GameRoom>.Filter 
       .NearSphere(room => room.RoomLocation, location.Longitude, location.Latitude, i_SearchRadius); 

     IFindFluent<GameRoom, String> gameModes = Mongo.Database.GetCollection<GameRoom>("Rooms") 
      .Find(filter) 
      .Project(room => room._id.ToString()); 

И называть его на месте = новый GeoPoint (0, 0), i_SearchRadius = 3, таким же образом, как и я в оболочке, то результат этого запроса будет включать обе точки.

Указатель правильно настроен в поле RoomLocation.

Может ли кто-нибудь увидеть явную ошибку, которую я здесь делаю? Поскольку я действительно не уверен, что происходит прямо сейчас.

Спасибо.

ответ

3

Хорошо, поэтому я думаю, что нашел.

Видимо, используя перегрузку NearSphere(), которая принимает 2 аргумента в парном разряде не работает,

NearSphere(room => room.RoomLocation, location.Longitude, location.Latitude, i_SearchRadius); 

Но изменение к перегрузке, которая принимает объект GeoJsonPoint с микросхемой GeoJson2DGeographicCoordinates как универсальный тип делает работу должным образом. Как это:

NearSphere(room => room.RoomLocation, GeoJson.Point<GeoJson2DGeographicCoordinates(new GeoJson2DGeographicCoordinates(location.Longitude, location.Latitude)), i_SearchRadius); 

Просто для справки.