2016-07-13 3 views
0

mongo를 사용하여 지리적 지점 근처의 위치를 ​​쿼리하는 동안이 이상한 문제가 발생합니다. C# 드라이버를 통해 $ nearSphere로 필터링을 시도 할 때마다 필터는 지정된 범위에 있는지 여부에 관계없이 모든 일치를 반환합니다. 이상한 점은 mongo 셸 자체에서 동일한 쿼리가 작동하고 올바른 일치 항목 만 반환한다는 것입니다.geoSpatial 쿼리가 mongo 셸에서 찾지 만 C# 드라이버에서 필터링되지 않습니다.

예.

데이타베이스에 Type : Point (C# 드라이버에서 직렬화 된 GeoJsonPoint 객체로 생성 됨)에 정의 된 RoomLocation 필드가있는 몇 개의 룸 객체가 데이터베이스에 있습니다. 이 포인트는 좌표가 [0, 0]과 [3, 3]이고 최대 거리가 3 인 [0, 0]에서 쿼리하므로 두 번째 포인트를 찾을 수 없습니다 (지리적 위치이므로 잘 작동 만 [0, 0] 포인트 반환

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

: 거리 내가 실행 해요 쿼리는

) 확실히 3. km의 좋은 수백해야합니다. 그러나, 나는 내 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, I 쉘에서와 같은 방식으로, 이 쿼리의 결과에는 두 점이 모두 포함됩니다.

색인은 RoomLocation 필드에 올바르게 설정됩니다.

내가 여기 만들고있는 분명한 실수를 볼 수 있습니까? 왜냐하면 나는 지금 무슨 일이 일어나고 있는지 정말로 확신하지 못하기 때문입니다.

감사합니다.

답변

3

좋아, 그래서 찾은 것 같아.

제네릭 형식이 작품 만들면서 분명히 작동하지 않습니다 루타로 2 개 인자를 허용 NearSphere()의 과부하,

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

를 사용하지만 GeoJson2DGeographicCoordinates와 GeoJsonPoint 객체를 받아들이는 과부하로 변경

정확히. 유사 항목 :

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

나중에 참조 할 수 있도록.