GeoSpatial查询工作在mongo shell中查找但不在C#驱动程序中进行过滤

时间:2016-07-13 11:39:17

标签: c# mongodb mongo-shell mongodb-.net-driver

在使用mongo查询地理位置附近的位置时,我遇到了这个奇怪的问题。 我注意到每当我尝试通过C#驱动程序通过$ nearSphere进行过滤时,过滤器只返回所有匹配,无论它们是否在给定范围内。 奇怪的是,同一个查询在mongo shell本身中起作用,只返回正确的匹配。

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());

在location = new GeoPoint(0,0),i_SearchRadius = 3上调用它,就像我在shell中一样,然后这个查询的结果将包括两个点。

在RoomLocation字段上正确设置了索引。

有人能看到我在这里犯的一些明显错误吗?因为我现在还不确定现在发生了什么。

感谢。

1 个答案:

答案 0 :(得分:3)

好的,所以我想我找到了它。

显然使用接受2个参数作为双精度的NearSphere()的重载不起作用,

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);

仅供将来参考。