【问题标题】:MongoDB + C# Driver + Geospatial fields querying - How to define location property on entitiesMongoDB + C# 驱动程序 + 地理空间字段查询 - 如何在实体上定义位置属性
【发布时间】:2012-07-11 02:06:24
【问题描述】:

我正在运行 Mongodb 2.06 版和 10Gen 提供的 C# 驱动程序 (1.5) 版。

我想在我的一个实体上显示纬度和经度坐标,以便我可以使用 GeoNear 或 Query.WithinCircle 查询实体。

我正在向我的实体添加一个强类型的 Location 对象,然后在我的实体上挂起的 Location 对象上创建一个索引,但我无法让任何 GeoNear 查询工作。

这就是我的 Location 实体的样子。

public class Location
{
    [BsonDefaultValue(null)]
    public Nullable<double> lon { get; set; }

    [BsonDefaultValue(null)]
    public Nullable<double> lat { get; set; }  
}

这就是我的相关实体的外观。

  public class SomeEntity
  {
   public string Field1 {get; set;}

   // more fields here...

   public Location Loc {get; set;}
  }

我找到了这个链接http://www.mongodb.org/display/DOCS/Geospatial+Indexing/,发现我的位置字段需要是一个数组。如果使用数组字段而不是 Location 对象,我的实体 SomeEntity 会是什么样子?

我知道这很简单,我就是想不通! :-)

谢谢

【问题讨论】:

    标签: mongodb mongodb-.net-driver


    【解决方案1】:

    你可以试试这个:

    public class SomeEntity
    {
        public string Field1 {get; set;}
    
        // more fields here...
    
       public double[] Loc {get; set;}
    }
    

    尽管您现有的类应该可以工作(虽然建议使用数组,但唯一真正的要求是对象由两个数字组成)。我可能不会使用 Nullable 而是使用 double 代替。

    您的地理查询以何种方式不起作用?

    【讨论】:

    • 嗨@Robert Stam - 感谢您的意见。我认为我的位置对象应该可以正常工作,因为它只提供了两个数字。我的地理查询没有返回任何数据。这是它的样子.. var options = GeoNearOptions.SetMaxDistance(100 / this.EarthRadius); var activeUsers = Query.EQ("Active",true); var potentialUsers = userCollection.GeoNear(activeUsers, nDestinationLatitude, nDestinationLongitude,5,options);使用以下代码在数据上建立索引 userCollection.EnsureIndex("IndexKeys.GeoSpatial("loc"));
    • 抱歉,我尝试格式化我的 cmets 代码,但找不到语法 :-)
    • 我发现了问题!当我定义索引时,我使用“loc”,而我的字段名称实际上是 Loc,区分大小写。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-13
    • 1970-01-01
    • 2012-03-04
    • 2013-09-16
    • 1970-01-01
    相关资源
    最近更新 更多