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# 驱动程序中没有过滤的主要内容,如果未能解决你的问题,请参考以下文章

mongoDb地理空间索引和查询

[Redis6]新数据类型_Geospatial

[Redis6]新数据类型_Geospatial

Ninjaframework、Morphia 和 GeoSpatial 索引

Reids 学习新数据类型 Geospatial 学习

Reids 学习新数据类型 Geospatial 学习