GeoSpatial 查询在 mongo shell 中工作,但在 C# 驱动程序中没有过滤
Posted
技术标签:
【中文标题】GeoSpatial 查询在 mongo shell 中工作,但在 C# 驱动程序中没有过滤【英文标题】:GeoSpatial queries working find in mongo shell but not filtering in C# driver 【发布时间】:2016-11-15 23:36:08 【问题描述】:我在使用 mongo 查询地理位置附近的位置时遇到了这个奇怪的问题。 我注意到,每当我尝试通过 C# 驱动程序按 $nearSphere 过滤时,过滤器只会返回所有匹配项,无论它们是否在给定范围内。 更奇怪的是,相同的查询在 mongo shell 本身中也有效,并且只返回正确的匹配项。
例如
我在数据库中有几个房间对象,它们的 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】:好的,我想我找到了。
显然使用接受 2 个参数作为双打的 NearSphere() 的重载不起作用,
NearSphere(room => room.RoomLocation, location.Longitude, location.Latitude, i_SearchRadius);
但是更改为接受具有 GeoJson2DGeographicCoordinates 作为泛型类型的 GeoJsonPoint 对象的重载使其正常工作。 像这样:
NearSphere(room => room.RoomLocation, new GeoJsonPoint<GeoJson2DGeographicCoordinates>(new GeoJson2DGeographicCoordinates(location.Longitude, location.Latitude)), i_SearchRadius);
仅供参考。
【讨论】:
以上是关于GeoSpatial 查询在 mongo shell 中工作,但在 C# 驱动程序中没有过滤的主要内容,如果未能解决你的问题,请参考以下文章