为什么在使用C#driver的类型化方法时会得到一个有效但不准确的$nearSphere查询?

为什么在使用C#driver的类型化方法时会得到一个有效但不准确的$nearSphere查询?,c#,mongodb,geospatial,mongodb-.net-driver,C#,Mongodb,Geospatial,Mongodb .net Driver,我正试图对MongoDB中的文档集合执行$nearSphere查询。在学习以键入方式生成查询所需调用的特定方法之前,我使用以下字符串插值来创建我的查询,并遵循在线文档: var query = _col.Find($"{{ location: {{ $nearSphere: {{ $geometry: {{ type: \"Point\", coordinates: [ {lon}, {lat} ] }}, $maxDistance: {rad} }} }} }}"); 这很有效。我的询问是准

我正试图对MongoDB中的文档集合执行
$nearSphere
查询。在学习以键入方式生成查询所需调用的特定方法之前,我使用以下字符串插值来创建我的查询,并遵循在线文档:

var query = _col.Find($"{{ location: {{ $nearSphere: {{ $geometry: {{ type: \"Point\", coordinates: [ {lon}, {lat} ] }}, $maxDistance: {rad} }} }} }}");
这很有效。我的询问是准确的。但是如果可能的话,我想改用类型化方法,这样编译器将来可以帮助我,所以我在网上寻找如何编写代码,在阅读了之前的StackOverflow答案后,我得出了这个结论:

var filter = Builders<Node>.Filter.NearSphere(n => n.Location, lon, lat, rad);
var query2 = _col.Find<Node>(filter);
…从而产生准确的结果)

第二个变成了

{find({ "location" : { "$nearSphere" : { "$geometry" : { "type" : "Point", "coordinates" : [1, 2] }, "$maxDistance" : 3 } } })}
{find({ "location" : { "$nearSphere" : [1.0, 2.0], "$maxDistance" : 3.0 } })}
…具有不同的形式,不能产生准确的结果


请注意,这里用于经度、纬度和半径的数字都是示例,我的应用程序使用了本地区的实际值,我可以通过检查OpenStreetMap数据进行确认。

我自己解决了这个问题,花了很多时间在文档中,玩代码,直到编译完成。我发现在文档中很难找到解决方案,因为除了关于不支持地理空间查询与LINQ的一小部分之外,他们没有执行地理空间查询的示例

使用C#driver的版本
2.7
执行此类查询的代码为:

var filterPoint = GeoJson.Point(new GeoJson2DCoordinates(lon, lat));

var filter = new FilterDefinitionBuilder<Node>()
             .NearSphere(n => n.Location, filterPoint, rad);

var query = _col.Find<Node>(filter);
请注意,
NodeBase
是我的DTO,用于在执行搜索时将我的
Node
文档返回给客户端
SimpleGeoJsonPoint
是我在其他DTO中使用的DTO,用于以简单的方式表示GeoJSON点。我不需要绒毛,只需要经度和纬度
MultiSearchResult
是我向客户端返回搜索结果的通用DTO

public class Node
{
    [BsonElement("_id")]
    public long Id { get; set; }

    [BsonElement("location")]
    public GeoJsonPoint<GeoJson2DCoordinates> Location { get; set; }

    [BsonElement("tags")]
    public BsonDocument Tags { get; set; }
}
// Perform query and map to DTO
var res = (await query.ToListAsync()).Select(n =>
{
    var lonLat = n.Location.Coordinates.Values.ToArray();

    return new NodeBase
    {
        Id = n.Id.ToString(),
        Location = new SimpleGeoJsonPoint
        {
            Lon = lonLat[0],
            Lat = lonLat[1],
        },
        Tags = n.Tags.ToDictionary(),
    };
});

return Ok(new MultiSearchResult<NodeBase>
{
    Count = res.Count(),
    Results = res,
});